[אתגר] מקסימום רקורסיבי

תגיות:

ניסיתי להריץ עכשיו שוב על שני המקרים שכתבת וזה הריץ והחזיר את התשובות הנכונות. האם ייתכן שטעית בהעתקה של אחת מהשורות? :slight_smile:

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

Screenshot_2

תודה שהעלית את הפתרון שלך שי. לא בדקתי נכונות של הקוד, אבל רציתי לשאול את @Yam - מבחינת עקרונות תכנות נכון, זה לא ״נכון״ בבעיה שלנו שהפונקציה הראשית תקבל עוד פרמטרים מלבד רשימה, נכון? (אפשר לעטוף אותה בפונקציה ראשית שתקבל כפרמטר רק רשימה וקוראת לפונקציה עם יותר פרמטרים, נכון?) השאלה שלי היא מדוע. כיצד לנמק מדוע זה פסול. (אולי זה קשור לעיקרון ההכמסה, אולי יש עוד סיבות?)
השאלה נשאלת ללא כל קשר לכך שביקשת שהפונקציה תקבל אך ורק רשימה כפרמטר, נניח והיית מתיר זאת.

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

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

לייק 1

באמת?! חייב להודות שאני ממש מופתע. בלי קשר למעקב אחרי הקוד, הרי פונקציה זו ״קופסה סגורה״. תאר לך שזו הייתה פונקציה שימושית בפייתון, אזי בכל פעם שהיית רוצה להשתמש בה היית צריך להזין בנוסף לרשימה גם את הקבוע 0. אבל אני מבין מדבריך ״שבעולם האמיתי״ בהייטק זה לא נורא, העיקר שיעבוד.
אגב עכשיו כשאני מסתכל על הסינטקס אני רואה שהאיתחול של הפרמטר x נעשה כבר בחתימת הפונקציה, לא היה לי מושג שזה אפשרי.

הפסקה השנייה שכתבת פותרת לך את הספקות :slight_smile: נלמד על זה בהמשך

2 לייקים

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

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

def maximum(lis):
    if len(lis) == 1:
        return lis[0]
    if lis[0] > lis[1]:
        return maximum(lis[0:1] + lis[2:])
    return maximum(lis[1:])

li = [1,4,3,27,18,7,8,9,0]
print(maximum(li))
print(li)

image

def maximum(list_of_numbers):
    if len(list_of_numbers) == 1:
        return list_of_numbers[0]
    elif list_of_numbers[0] > list_of_numbers[1]:
        list_of_numbers.pop(1)
        return maximum(list_of_numbers)
    else:
        list_of_numbers.pop(0)
        return maximum(list_of_numbers)


maximum([1,2,3,1,5,8,10,40,32])

‏‏לכידה