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

תגיות:

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

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

ניתן לבדוק האם הפתרון שלכם עובד בעזרת הרצת הקוד שכאן אחרי שהגדרתם את הפונקציה שלכם:

import random


def listgen1():
    return [random.uniform(-1000, 1000) for i in range(random.randrange(1, 999))]


def listgen2():
    return [random.randrange(-1000, 1000) for i in range(random.randrange(1, 999))]


def listgen3():
    return [0 for i in range(random.randrange(1, 999))]


def listgen4():
    return [9.9 for i in range(random.randrange(1, 999))]


def check(l):
    try:
        assert max(l) == maximum(l), f"Failed for input {l}"
    except Exception as e:
        print(f"{e}, {l}")


check([1, 2, 3])
check([3, 2, 1])
check([3, 1, 1])
check([3, 3, 1])    
check([1])


for i in range(100):
    check(listgen1())
    check(listgen2())

check(listgen3())
check(listgen4())
3 לייקים
def maximum(list_of_numbers, index, max):
    if index == len(list_of_numbers):
        return max
    if list_of_numbers[index] > max:
        max = list_of_numbers[index]
    return maximum(list_of_numbers, index+1, max)

maximum(list_of_numbers, 0, list_of_numbers[0])

תמונה

4 לייקים

יפה, אבל זה לא מה שביקשו בשאלה :slight_smile:
על הפונקציה להיות בעלת פרמטר אחד בלבד

אין בעיה לעטוף אותה אם זה מה שאתה מתכוון

זה לא מה שאני מתכוון, הכוונה היא לפונקציה אחת :slight_smile:

הכי פשוט לכתוב כך:
אבל לזה אתה מתכוון?

def maximum(list    _of_numbers) :
            list_of_numbers.sort()
            return list_of_numbers[len(list_of_numbers) - 1]
2 לייקים

טכנית כן, אהבתי את המקוריות :slight_smile:
עכשיו בלי sort/sorted.

יפה! בניתי קצת בדיקות והפונקציה שלך עוברת את כולן. (מי שרוצה לבדוק שהפונקציה שלו עובדת מוזמן להריץ)

import random


def listgen1():
    return [random.uniform(-1000, 1000) for i in range(random.randrange(999))]


def listgen2():
    return [random.randrange(-1000, 1000) for i in range(random.randrange(999))]


def listgen3():
    return [0 for i in range(random.randrange(1, 999))]


def listgen4():
    return [9.9 for i in range(random.randrange(1, 999))]


def check(l):
    assert max(l) == maximum(l)


for i in range(100):
    l = listgen1()
    check(l)
    l = listgen2()
    check(l)


l = listgen3()
check(l)
l = listgen4()
check(l)
l = [1]
check(l)
לייק 1

פתרון נוסף

def maximum(list_of_numbers):
    if len(list_of_numbers) == 1:
        return list_of_numbers[0]
    
    if list_of_numbers[0] > list_of_numbers[1]:
        list_of_numbers.pop(1)
        return maximum(list_of_numbers)
    list_of_numbers.pop(0)
    return maximum(list_of_numbers)
לייק 1

עבודה טובה, רק שים לב שאתה משנה את list_of_numbers וזה נחשב לא לגמרי מנומס (מי שהעביר לך רשימה מצפה שהיא תהיה אותה רשימה גם אחרי שהוא מריץ את הפונקציה שלך).
במקרה שלך:
image

לייק 1

2020-04-23 11_06_18-‪Bonus - Jupyter Notebook

לייק 1

מותר להשתמש במתודות של רשימות ובכלל בכל מה שלמדנו עד עכשיו חוץ מלולאות, כן?

כן. הוספתי עוד הגבלה: אין להשתמש ב־sorted/sort :slight_smile:

def find_max(number_list):
    if len(number_list) > 1:
        if number_list[-1] > number_list[-2]:
            number_list.pop(-2)
        else:
            number_list.pop(-1)
        return find_max(number_list)
    else:
        return number_list[0]

איך עושים שזה יראה כמו קוד כאן עם הזחות? :face_with_monocle:

מקשטים משני הצדדים ב־```

יפה מאוד! עבודה טובה

יופי!
אבל שים לב שאתה משנה את הרשימה המקורית, מה שנחשב פחות מנומס:

l = [3, 2, 1]
print(find_max(l))
print(l)

3
[3]

image

4 לייקים