עזרה בתרגיל בפייתון

  • פותח הנושא tweeg
  • פורסם בתאריך

tweeg

New member
עזרה בתרגיל בפייתון

מטרה:
Description: Given an input of a list of numbers and a high number, return the number of multiples of each of those numbers that are less than the
maximum number. For this case the list will contain a maximum of 3 numbers that are all relatively prime to each other.

ניסיתי לפתור את זה בקובץ המצורף(אני לא מצליח להעביר את זה לכתב בצורה נורמלית במקום תמונה)
כשהרשימה היא 1 או 2 התשובה יוצאת בסדר,אבל ב3 היא יוצאת בסדר רק למקרה הנמוך,ולמקרים גבוהים יותר הזמן ריצה גבוה מדי
אם מישהו יוכל בבקשה לעבור בעיקר על test3 ולהגיד לי מה לא בסדר אני ממש אשמח.אני די בטוח שהתהליך עצמו חוץ מזה תקין.
אני מניח שזה נראה לעין שאני רק מתחיל,לכן אם אפשרי יהיה לעזור לי במסגרת הכלים שהתשמשתי בהם פחות או יותר ולא למצוא דרך אחרת
סופר יעילה לעשות את זה עם מלא כלים שאני לא מכיר.

תודה מראש על כל ניסיון לעזור,אני לא כ"כ בטוח מה היקף ההשקעה שזה דורש ולכן אם הגזמתי
אני מתנצל מראש
(אני יודע שלי היה לוקח המון זמן להבין את זה אבל אני רק מתחיל)
יום טוב לכולם
 

tweeg

New member
ניסיון

def test2(a,b,max1): rid1=0
mult1=a*b
mult2=a*b while mult1<max1: rid1=rid1+1 mult1=mult1+mult2 return rid1def test3(a,b,c,max1): count=[] mult1=a*b mult2=a*b mult3=a*c mult4=a*c mult5=b*c mult6=b*c while mult1<max1: if mult1 not in count: count.append(mult1) if mult1+mult2<max1: if mult1+mult2 not in count: count.append(mult1+mult2) mult1=mult1+mult2 else: break while mult3<max1: if mult3 not in count: count.append(mult3) if mult3+mult4<max1: if mult3+mult4 not in count: count.append(mult3+mult4) mult3=mult3+mult4 else: break while mult5<max1: if mult5 not in count: count.append(mult5) if mult5+mult6<max1: if mult5+mult6 not in count: count.append(mult5+mult6) mult5=mult5+mult6 else: break return count def countMultiples(list1,max1): list2=[] a=0 for entry in list1: if entry<max1: list2.append(entry) for entry in list2: if max1%entry==0: a=a+int(max1/entry)-1 if max1%entry!=0: a=a+int(max1/entry) if len(list1)==2: rid=test2(list1[0],list1[1],max1) a=a-rid if len(list1)==3: rid=test3(list1[0],list1[1],list1[2],max1) a=a-len(rid) return a print countMultiples([13,35,47],389560)
 

mazory

New member
כמה דברים

(ממבט חפוז)
&nbsp
ראשית נסה להבין מדוע התוכנית כפי שהיא לא מסתיימת (רמז - מהם תנאי היציאה של הלולאה?)
&nbsp
שנית, בשאלה ביקשו את מספר המכפלות ולא את המכפלות עצמן.
&nbsp
שלישית, איך הקוד שלך היה נראה אם אורך הרשימה היה 5? האם יש דרך לפתור את השאלה תוך שימוש בלולאה על רשימת המספרים המקורית (list1) , במקום לפרק אותה לכל זוגות המכפלות?
&nbsp
נסה לכתוב את זה בעברית על דף, ולהבין איך זה צריך לעבוד לפני שאתה כותב קוד.
 

tweeg

New member
תגובה

1.כן,יש לי בעיה עם לעקוב אחרי לולאות גדולות,אני צריך לחזור על החומר של לולאות ולולאות בתוך לולאות
2.הבעיה שאם אני רק סופר מכפלות יהיו לי כפילויות,נגיד 2,3,4 אז 12 יופיע גם ב2*3*2 וגם ב4*3.הפתרון שלי הוא
לעשות רשימה ללא כפילויות ואז פשוט len לרשימה ולהחסיר את הכפולות
3.זה רעיון טוב(התרגיל היה עד 3 לרשימה,אז התעצלתי וניסיתי לפרק למקרים) אני עובד עכשיו על הפתרון הזה,אבל
מסתבך עם הריצה על הרשימה(בנתיים זה רץ על חלק ומפסיק,וכשאני מנסה שזה ירוץ על הכל זה לא מסתיים)
4.יש לי פער של יישום מה שאני כותב למה שאני יודע לעשות,לכן זה כמעט תמיד לא יוצא טוב ואני צריך "לאלתר" עם מה שאני כן יודע,
אני מניח שבעתיד זה ישתפר.

תודה רבה מאוד על העזרה,אני מנסה להתכונן טיפה ללימודים באוקטובר וזה ממש מעצבן להתקע על דברים
שהם בד"כ מאוד קטנים.
אני מניח שזה לא כ"כ מעניין בשבילכם,ואני מניח שמפה אני כבר אסתדר.
שוב מודה לך מאוד.
 

tweeg

New member
שאלת המשך

כתבתי את הקוד שיתאים לכל רשימה,אבל הוא עדיין מחזיר לי זמן ריצה גבוה מדי כשהרשימה ארוכה
או המספר מקסימום גבוה(100 לרשימה של 3 50 לרשימה של 5)
האם לדעתך הקוד תקין והזמן ריצה שלו פשוט גבוה מדי?האם אני יכול לפתור את זה בלי לכתוב
את הקוד בצורה שונה לגמרי?

 

BravoMan

Active member
אני חושב שאחת הסיבות שתרם ענו לך,

היא שכמעת בלתי אפשרי לקרוא את הקוד שכתבת.
&nbsp
תעתיק את הקוד לקובץ טקסט פשוט, וצרף את הקובץ כאן.
אם יש בעיה עם זה מסיבה כלשהי, נסה להעתיק ולהדביק את הקוד באתר pastebin.com והביא קישור לעמוד באותו אתר.
&nbsp
כך יהיה קל יותר לעוזרים פוטנציאלים לקרוא ולהבין את הבעיה שלך.
 

tweeg

New member
נסיון

http://pastebin.com/ERaXyejj
תודה רבה על הניסיון לעזור,אני חושב שעכשיו יראה יותר מסודר.
לדעתי הtest4 עובד,אם תריץ את הקוד תראה של100 הוא עובד יופי,אבל ל200 כבר לא.
השאלה שלי היא האם הקוד בסדר ופשוט לוקח לו המון זמן לרוץ,או שהוא לא כתוב נכון.

תודה רבה על התגובה כבר די ויתרתי על תשובה
(זה לא תרגיל בשביל משהו,סתם ללמידה)
 

BravoMan

Active member
כמה דברים:

ראשית, אני לא בטוח מה ניסית לעשות, אבל תשובה לשאלה שהצגת אינה נמצאת בקוד שלך.
אני חושב שהבעיה, כמו ש-mazory כתב, היא שאתה ישר כותב קוד, ולא מתכנן מה הקוד צריך לעשות מראש.
&nbsp
תעצור, קח דף ועט, ותפרט שלב שלבם את הדרך לפתרון הבעיה.
אם אתה רואה שאינך יכול לתרגם שלב מסוים לקוד, סימן שצריך לפרק אותו לתת שלבים פשוטים יותר.
ייתכן גם, שצריך למצוא את הנוסחה המתמטית שמאחורי הבעיה, ולא לנסות לפתור אותה ב-"brute force", ע"י ריצה על כל האפשרויות.
&nbsp
יש מספר בעיות עם הפונקציה שכתבת, אבל העיקרית היא שאם כפולה מסוימת חוזרת על עצמה, הלולאה הפנימית ביותר הופכת לאין סופית, והתוכנית לא תסתיים לעולם.
היות ואתה מנסה להריץ את התוכנית דרך אתר ולא במחשב שלך, אני מניח שאחרי זמן מה האתר פשוט זורק אותך החוצה, אז אתה חושב שהתוכנית רצה הרבה זמן.
&nbsp
אם היית מריץ על המחשב שלך, התוכנית לא היית מסתיימת עד שהיית עוצר אותה בעצמך או מכבה את המחשב.
&nbsp
כלל חשוב מאוד בלולאות:
על תשאיר שום מצב שהמשתנים שאחראים על יציאה מהלולאה נשארים קבועים. זו דרך בטוחה ליצור לולאה אין סופית, וזה מה שעשית כאן.
&nbsp
כדי לראות מה בדיוק משתבש, אתה יכול להכניס הוראות print פנימה, ולראות מה קורה ל-countrid1 ו-countrid2, כשאתה שם 200 בתור max.
 

tweeg

New member
תגובה

long story short:תיקנתי את הקוד המקורי,וכתבתי אחד פשוט יותר.
למי שמתעניין יותר:

*מה שניסיתי לעשות היה למצוא את מספר הכפולות שיש לגורמים ברשימה עד המספר המקסימלי.עקב תכנון לא נכון
ניסיתי למצוא קודם את מספר הכפולות הקיים לכל הגורמים יחד,ואז להחסיר מזה את הכפולות המשותפות
למשל ל[3,5,7] ולמקסימום 30 ניסיתי למצוא את המספר כפולות של 3(9)+של 5(5) ול7(4) כלומר 18 ביחד,והלחסיר את הכפולות שמופיעות יותר מפעם אחת
למשל 15 מופיע ברשימה של 3 ו5.
אני מסכים שזה היה over complicating שנבע מחוסר מחשבה ותכנון.

*אני לא חושב שלדברים כאלה יש נוסחא(שאני מסוגל לראות),אלא סתם חישוב.איפה שאני רואה דפוס מסוים אני אכן
מנסה למצוא את החוקיות ולכתוב בעזרתה

*הצלחתי לתקן את הפונקציה
http://pastebin.com/91xpcPP2
התוספת היא סה"כ שורה 32-33,שמגדילה את התנאי של הלולאה הקטנה(לא שמתי לב שיש מצבים שהוא לא גדל
כי חשבתי שהוא גדל לכל מצב,ובזכות ההערה שלך ראיתי שיש מצבים(כפולות שחוזרות) שבהם זה לא קורה)

*הפונקציה החדשה והפשוטה יותר:
http://pastebin.com/dhrquC2w

*ניסיתי למצוא תוכנה למחשב בשביל להריץ אבל לא הצלחתי למצוא משהו מקביל למה שאני רגיל אליו:
http://repl.it/languages/Python
אני לא כ"כ יודע איך הדבר הזה נקרא,ניסתי להוריד שתי תוכנות,אחת נראתה כמו הcmd ולשניה יש רק חלון אחד
והיא לא עובדת באותה צורה

*אני מסכים שאני צריך לעבוד על חשיבה תכנון וביצוע יותר מסודרים,אני אעבוד על זה.אני מניח שזה מה
שגורם לרוב הבעיות שלי.

תודה רבה מאוד על העזרה ועל התשובות המפורטות והמועילות.
יום טוב לכולם
 
למעלה