2017-01-26 3 views
1

Я хочу получить доступ к спискам, которые создаются во время рекурсии, но я получаю только доступ к первому.Списки в рекурсивной функции

my_data = [1,2,3,4,5] 

def my_function (some_data): 
    some_list = [] 
    for i in range(len(some_data)-1): 
     some_list.append(some_data[i+1]+some_data[i]) 

    if len(some_list)>1: 
     my_function(some_list) 

    return some_list[0] 

forty_eight = my_function(my_data) 

поэтому идея в том, что во время первого шага я получаю сумму каждого соседа элементов, так что я получаю [3,5,7,9], рядом я получаю [8,12,16], затем [20 , 28], и, наконец, я получаю [48].

Поскольку последний список имеет один элемент, я хочу вернуть его переменной с именем «forst_eight», но проблема в том, что эта переменная равна трем. Это означает, что после команды возврата программа использует первый список, который я создал, а не последний. Какая шерсть, которую я делаю, чтобы сделать сорок ночью равной 48?

ответ

1

Вы забыли вернуть свой рекурсивный звонок return my_function(some_list). Это важно, потому что вы снова и снова вызываете my_function, пока ваше условие прерывания не будет истинным, НО вы никогда не вернете значение, поэтому действительно используется только исходный список.

my_data = [1,2,3,4,5] 

def my_function (some_data): 
    some_list = [] 
    for i in range(len(some_data)-1): 
     some_list.append(some_data[i+1]+some_data[i]) 

    if len(some_list)>1: 
     return my_function(some_list) 

    return some_list[0] 

forty_eight = my_function(my_data) 
print forty_eight # >>> 48 
+0

большое спасибо, до сих пор не понимаю, почему это работает. Попробуем найти информацию. – Demaunt

+0

Это действительно сработало, но вы не использовали значение :) – ppasler

1

Вы вызываете свою внутреннюю функцию, но вы не используете ее выход. Вероятно, вы должны

if len(some_list)>1: 
    return my_function(some_list) 
0

Что вы делаете, все правильно обрабатывает, но не возвращает правильное значение. Когда все рекурсивные функции завершают обработку, ваша функция возвращает 1-е значение. Отредактируйте функцию, чтобы вернуть значение рекурсивной функции в качестве нового значения.

if len(some_list) > 1: 
    return my_function(some_list) 
0

Другие люди обратились к конкретным вопросам с вашей текущей реализацией. Я отправляю этот ответ только для того, чтобы предложить альтернативный подход к вашей цели рекурсивного суммирования соседних элементов в списке, который вы можете найти немного яснее.

def sum_reduce(l): 
    if len(l) == 1: 
     return l[0] 
    else: 
     summed_neighbours = [a + b for a, b in zip(l[:-1], l[1:])] 
     print(summed_neighbours) 
     return sum_reduce(summed_neighbours) 

if __name__ == '__main__': 
    print('Result: ', sum_reduce([1,2,3,4,5])) 

Выход

[3, 5, 7, 9] 
[8, 12, 16] 
[20, 28] 
[48] 
Result: 48 
Смежные вопросы