После изменения элементов списка меняются?

#python

#python

Вопрос:

после того, как я изменил свой список, элементы списка меняются неправильно, вот мой первый код

 def reverse_fib_series(num):
    x = []
    for i in range(num):
        if i == 0:
            x.append(0)
        elif i == 1:
            x.append(1)
        else:
            x.append(sum(reverse_fib_series(i)[-2:]))
    return x

print(reverse_fib_series(11))
 

он возвращает [0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55]

если я хочу изменить его

 def reverse_fib_series(num):
    x = []
    for i in range(num):
        if i == 0:
            x.append(0)
        elif i == 1:
            x.append(1)
        else:
            x.append(sum(reverse_fib_series(i)[-2:]))
    return x[::-1]

print(reverse_fib_series(11))
 

он возвращается [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0] . Я не знаю, почему?

я пытаюсь решить следующее упражнение: «В числах Фибоначчи каждое число прогрессирует как сумма двух предыдущих чисел, например 0,1,1,2,3,5,8, … В этом вопросе вам дается число (0 <N <20) . Соответственно, напишите программу, которая печатает все числа Фибоначчи в обратном порядке от N-го числа Фибоначчи.»

Комментарии:

1. Вы должны либо использовать рекурсию, либо цикл. Делать так, как вы делаете, имеет мало смысла.

2. почему вы не можете просто найти ряд и изменить его?

3. Вы можете просто вернуться a[::-1]

Ответ №1:

Это происходит потому, что вы переворачиваете список в каждом рекурсивном вызове, а не переворачиваете его только один раз в конце — поэтому вместо суммирования последних двух элементов ряда для получения следующего элемента, вы суммируете первые два элемента, которые всегда равны 0 и 1. Вот почему каждый элемент ряда после первых двух становится 1. (Список не меняется, когда вы меняете его в конце, вычисление ряда прерывается, потому что вы меняете его каждый раз.)

Вы могли бы написать функцию так, чтобы она строила последовательность на месте от начала до конца, или вы могли бы исправить это, упростив тело цикла, чтобы исключить ненужную рекурсию, но это хорошая возможность изучить концепцию составления двух простых вещей для создания одной более сложной вещи. 🙂 Вместо того, чтобы пытаться сделать все это сразу, возьмите рабочую (если неоптимальную) функцию, которую вы уже должны создать для ряда Фибоначчи, а затем измените ее впоследствии:

 def fib_series(num):
    x = []
    for i in range(num):
        if i == 0:
            x.append(0)
        elif i == 1:
            x.append(1)
        else:
            x.append(sum(fib_series(i)[-2:]))
    return x

def reverse_fib_series(num):
    return fib_series(num)[::-1]
 

Обратите внимание, что ваша fib_series функция может быть немного проще, чем то, что вы написали; вам не нужно рекурсивно вызывать fib_series , чтобы получить последние два числа, потому что они уже хранятся в x :

 def fib_series(num):
    x = []
    for i in range(num):
        if i == 0:
            x.append(0)
        elif i == 1:
            x.append(1)
        else:
            x.append(sum(x[-2:]))
    return x
 

или вы могли бы сделать его немного короче, написав его как генератор:

 def fib_series(num):
    x = [0, 1]
    x.extend(sum(x[-2::]) for _ in range(num - 2))
    return x[:num]
 

Ответ №2:

попробуйте этот код:

 def reverse_fib_series(num):
    x = []
    for i in range(num):
        if i == 0:
            x.append(0)
        elif i == 1:
            x.append(1)
        else:
            x.append(sum(reverse_fib_series(i)[-2:]))
    return x

print(reverse_fib_series(11)[::-1])
 

измените возвращаемое значение, потому что вы используете рекурсию в функции

Ответ №3:

Потому что вы меняете массив внутри рекурсивной функции. Он добавляет одно число и обратно. И он продолжает повторять процесс.

Этот код будет

 def reverse_fib_series(num):
    x = []
    for i in range(num):
       if i == 0:
           x.append(0)
       elif i == 1:
           x.append(1)
       else:
           x.append(sum(reverse_fib_series(i)[-2:]))
   return x

reversed = reverse_fib_series(11)[::-1]
print(reversed) 
 

Ответ №4:

Просто другие способы, используя [].insert(0, sum())

 
def reverse_fib_loop(n: int):
    lx = []
    for i in range(n):
        if i > 1:
            lx.insert(0, sum(lx[:2]))
        else:
            lx.insert(0, i)
    return lx

def reverse_fib_recursion(size: int):
    def wrapped(lx: list, sn: int, n: int):
        if n > 0:
            lx.insert(0, sn)
            sn = sum(lx[:2]) if len(lx) >= 2 else 1
            return wrapped(lx, sn, n-1)
        return lx
    return wrapped([], 0, size)

if __name__ == '__main__':
    N = int(input('N='))
    print(reverse_fib_loop(N))
    print(reverse_fib_recursion(N))