1

Тема: Рекурсія: знайти найбільший член серед додатних членів послідовності

Знайти найбільший член серед додатних членів послідовності через рекурсію
Допоможіть будь-ласка *SORRY*

2

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

alinabelayaa написав:

Знайти найбільший член серед додатних членів послідовності через рекурсію
Допоможіть будь-ласка *SORRY*

В чому саме проблема?

Подякували: koala1

3

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

HetmanNet написав:
alinabelayaa написав:

Знайти найбільший член серед додатних членів послідовності через рекурсію
Допоможіть будь-ласка *SORRY*

В чому саме проблема?

def Max(n):
    w = Max(n-1)
    if n == 1:
        Max = a[0]
    else:
        if a[n-1] < w:
            return w
        else:
            return a[n-1]
            
n = int(input('n='))
a = []
for i in range(0, n):
    x = int(input('a[{}]='.format(i+1)))
    a.append(x)
print(a)
print('max =', Max(n))

Вибиває помилку  "local variable 'Max' referenced before assignment"
Спробувала прибрати функцію у return, але тоді вже не знаю що зробити з другим if

4

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

HetmanNet написав:
alinabelayaa написав:

Знайти найбільший член серед додатних членів послідовності через рекурсію
Допоможіть будь-ласка *SORRY*

В чому саме проблема?

зробити рекурсію коротше  і швидше за це

A = [-1,2,3]
A = [i for i in A if i > 0]
print(sum (A))

5

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

ur_naz написав:
HetmanNet написав:
alinabelayaa написав:

Знайти найбільший член серед додатних членів послідовності через рекурсію
Допоможіть будь-ласка *SORRY*

В чому саме проблема?

зробити рекурсію коротше  і швидше за це

A = [-1,2,3]
A = [i for i in A if i > 0]
print(sum (A))

Це не рекурсія

Подякували: koala1

6

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

Ви неправильно розумієте рекурсію.
Вам потрібна така функція Max, яка з масиву робить його суму (принаймні, його частини), визначену через саму цю функцію.
Приблизно так:

Max:
- якщо масив пустий, повернути 0
- якщо перший елемент додатний, повернути його + Max(решти елементів)
- інакше повернути Max(решти елементів) #нам не потрібно нічого додавати

Масив, що складається з усіх елементів масиву a, крім початкового - це в Puthon a[1:]. Зможете це закодувати?

7

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

koala написав:

Ви неправильно розумієте рекурсію.
Вам потрібна така функція Max, яка з масиву робить його суму (принаймні, його частини), визначену через саму цю функцію.
Приблизно так:

Max:
- якщо масив пустий, повернути 0
- якщо перший елемент додатний, повернути його + Max(решти елементів)
- інакше повернути Max(решти елементів) #нам не потрібно нічого додавати

Масив, що складається з усіх елементів масиву a, крім початкового - це в Puthon a[1:]. Зможете це закодувати?

Зараз спробую

8

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

/KIT\ написав:
ur_naz написав:
HetmanNet написав:

В чому саме проблема?

зробити рекурсію коротше  і швидше за це

A = [-1,2,3]
A = [i for i in A if i > 0]
print(sum (A))

Це не рекурсія

ну так зроби коротше і ефективніше з рекурсієй :D

9

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

koala написав:

Ви неправильно розумієте рекурсію.
Вам потрібна така функція Max, яка з масиву робить його суму (принаймні, його частини), визначену через саму цю функцію.
Приблизно так:

Max:
- якщо масив пустий, повернути 0
- якщо перший елемент додатний, повернути його + Max(решти елементів)
- інакше повернути Max(решти елементів) #нам не потрібно нічого додавати

Масив, що складається з усіх елементів масиву a, крім початкового - це в Puthon a[1:]. Зможете це закодувати?

У мене виходить, що вона просто шукає сумму всіх додатніх елементів
А я не розумію як тоді можна знайти найбільший?

10

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

Так, вибачте, неуважно прочитав умову (а слово Max мало б насторожити). Там не сума, там максимум у другій гілці. А якщо поверне 0 - значить, не було додатних чисел.

-- якщо перший елемент додатний, повернути його + Max(решти елементів)
+- якщо перший елемент додатний, повернути з нього і Max(решти елементів) більший

Цікавий факт: найбільший елемент масиву є одночасно найбільшим серед додатних його членів, якщо вони там є :)

Подякували: alinabelayaa1

11 Востаннє редагувалося ur_naz (03.12.2019 08:14:01)

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

тому це завдання є хибним. воно має бути таким: знайти найменше з позитивних
щоб якщо,
A = [-1,2,3]
то рішення було не
max(A)
a хоча б
min([i for i in A if i > 0])
або

Прихований текст

а потім вони питають, чому студенти такі дебіли

Прихований текст
def rmax (W):
    if len(W) == 0:
        return 0; # якого біса?
    if W[0] <= 0:
       return rmax(W[1:])
    if len(W) == 1:
        return W[0];
    a=W.pop(0)
    if len(W)==1:
        b=W[0]
    else:
        b = rmax(W)
    if a < b: # точка жи
        return a
    else: 
        return b
Прихований текст

12

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

ur_naz написав:

тому це завдання є хибним. воно має бути таким: знайти найменше з позитивних

Звідки ви це взяли? Якщо завдання виявляється простішим, ніж воно сформульоване, то це не означає, що воно є хибним. Наприклад, якщо ми шукаємо найкраще місце для бази на Марсі, де була б можлива вода в рідкому стані, то це завдання цілком виправдане.


Прихований текст
ur_naz написав:

а потім вони питають, чому студенти такі дебіли

Бо їм так підказують на форумах

Прихований текст
ur_naz написав:
def rmax (W):
    if len(W) == 0:
        return 0; # не якого біса, а ознака відсутності додатних чисел
    if W[0] <= 0:
       return rmax(W[1:])
    if len(W) == 1:
        return W[0];
    a=W.pop(0)
    if len(W)==1: #ця перевірка є в rmax, можна просто b = rmax(W)
        b=W[0]
    else:
        b = rmax(W)
    if a < b: # точка жи
        return a
    else: 
        return b
def rec_max(a):
    if len(a)==0:
          return 0
     x, y = a[0], rec_max(a[1:])
     if x<=0:
          return y
     if x<y:
          return y
     else:
          return x
            

13

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

"Звідки ви це взяли?"
тому що воно призводить до помилок, бо не призводить до помилок, бо 0 таке ж саме число як і 1 і 2 та інші
і ще 1 зайва ітерація хто зна до чого призведе

14 Востаннє редагувалося koala (03.12.2019 12:31:08)

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

ur_naz написав:

"Звідки ви це взяли?"
тому що воно призводить до помилок, бо не призводить до помилок, бо 0 таке ж саме число як і 1 і 2 та інші
і ще 1 зайва ітерація хто зна до чого призведе

Якщо я правильно зрозумів цей потік свідомості, то ви відповідали не на питання, чому ви вважаєте, що в умові помилка, а коментували повернення 0 як ознаки відсутності чисел. Будь ласка, дайте відповідь на моє питання.
Що ж до нуля - то функція у нас рекурсивна, і падати через те, що хвіст не містить потрібних чисел, не має. Втім, повертати некоректне значення - цілком поширена практика, наприклад, для пошуку в рядку є дві функції: str.index, яка кидає ValueError за відсутності потрібного значення, та str.find, що повертає -1, що є коректним індексом в Python. Тобто s[s.find('a')] може дорівнювати зовсім не 'a'. Просто це треба враховувати при використанні функцій. В умові не сказано, що робити за відсутності додатних чисел у списку; повернення 0 - далеко не гірший варіант.

ur_naz написав:

і ще 1 зайва ітерація хто зна до чого призведе

Якщо є сумніви, що глибини рекурсії вистачить, то не треба застосовувати рекурсію. Завжди може статися так, що вашу функцію викличуть з іншої, що додасть той самий зайвий рівень глибини.

15

Re: Рекурсія: знайти найбільший член серед додатних членів послідовності

воно хибне навіть не тому, що помилкове, бо відповідь буде завжди містити помилку. а тому що не має жодного сенсу, бо вирішується за допомогою одної функції max, яка ще й генерує помилку для [].
якщо ви не розумієте чому функція, яка не падає, містить помилку, то що вам сказати? бажаю вам розділити ваш потік свідомості на результат такої функції...
доречі, до чого тут рядки? потік?ваша функція не генерує -1. вона генерує будь яке число. це все одне, якби вона генерувала інтегер або стрінг, навіть гірше, бо в такому випадку рано, чи пізно, помилка вискочить
а тут ні. хіба ви вважаєте що str.find повертає інтегер? це не так. вона повертає варіант... як і тут.
"Завжди може статися так, що вашу функцію викличуть з іншої, що додасть той самий зайвий рівень глибини." сказали А кажіть і Б

і на останок... щоб не робити з студентів дебілів. треба думати, коли складаєш завдання. вони повинні бути
1) цікавими
2) корисними
3) мати єдиний і доцільний розв'язок
а тут нічого з того немає