האמת שאני בדיוק מחפש פתרון בלי לשנות אותה, תודה
הצלחתי, קצת לא אלגנטי אנסה לשפר
def maximum(num_list):
if len(num_list) == 1:
return num_list[0]
if num_list[-1] < num_list[-2]:
return maximum(num_list[:-1])
else:
return maximum(num_list[:-2] + [num_list[-1]])
def maximum(num_list):
if type(num_list) != list or len(num_list) == 0:
return print("This function expects a list of numbers")
new_num_list = num_list.copy()
if len(new_num_list) > 1:
if new_num_list[0] > new_num_list[1]:
new_num_list.pop(1)
else:
new_num_list.pop(0)
return maximum(new_num_list)
else:
return new_num_list[0]
מה באמת אמורה לעשות הבדיקה? @Yam
כלום אם היא מצליחה
שים לב שאתה משנה הרשימה המקורית שהועברה לפונקציה
אם הוא יוצר עותק הוא לא משנה אותה לא?
צודק, לא שמתי לב לעותק
עדיין ישנם פתרונות אלגנטיים יותר (כי כרגע מתבצעת שם העתקה של המון תתי רשימות)
זה הקוד שלי:
def maximum(l):
max_num = l[0]
if len(l) > 1:
if l[1] > max_num:
max_num = maximum(l[1:])
else:
l.remove(l[1])
max_num = maximum(l)
return max_num
עבד לי עם הרשימות שלי, לא הצלחתי להריץ עם הבדיקה שלך…
עכשיו ללבל הבא: בלי copy
def maximum(lst):
i = len(lst) -1
if i == 0:
return lst[i]
res = lst.copy()
res.pop()
res = maximum(res)
#another option is - return max(res,lst[i])
if res > lst[i]:
return res
else:
return lst[i]
עם הזחות
אהלן ים, כתוב להשתמש אך ורק בחומר שלמדנו כבר. רקורסיה לא נופלת תחת חומר שלא למדנו?
לא.
למה בלי copy? מה הבעיה?
הפתרון שלי. אשמח להערות מכל בחינה (יעילות, רווחים, צורת כתיבה וכו׳)
הערה: השתמשתי במילים “l” ו-“m” במקום “num_list” ו-״maximum” בהתאמה מכיוון שהקוד נכתב באפליקציה באייפון וניסיתי שכל שורת קוד לא תצטרך לחרוג לשורה הבאה.
היי @orpazf ,
אפשר הסבר מה קורה בחלק האחרון של הפונקציה, ניסיתי להריץ אותה
בvisualize python ובמחברת.
אני מקבל שגיאה שיש חריגה בגודל הרקורסיה
על איזה גודל ניסית להריץ אותה? לרוב מחסנית הקריאות לפונקציה מוגבלת וניתן להגיע לכל היותר ל-999 קריאות רקורסיביות לפני שנזרקת שגיאה
בהתחלה,
[0, 1, 15, 3, 18, 5, 6, 14, 8, 1012, 9, 7, 4, 2, 20]
אחרי השגיאה
[0, 1, 15]