Последовательность фиббоначи Python

Я новичок в python, и я пытаюсь создать скрипт, который будет печатать последовательность фибоначчи в виде списка или указанное число в последовательности на основе заданного числа. Возможно, это звучит запутанно, поэтому позвольте мне показать вам код, а затем объяснить.

number = 1
last = 0
before_last = 0

def Fibonacci(number, last, before_last):
    Question = raw_input('Would you like a List or the Number: ')

    X = raw_input('Give a number: ')
    print number

    if Question == "List":
        for counter in range(0, int(X) - 1):
            before_last = last
            last = number
            number = before_last + last
            print number

    if Question == "Number":
        for counter in range (int(X) - 2, int(X) - 1):
            before_last = last
            last = number
            number = before_last + last
            print number

Fibonacci(number, last, before_last)

По сути, вы выбираете список или номер и указываете код своего номера. Число берется и используется в диапазоне. Однако с единственным числом будет напечатано только число один. Почему это так, и как мне это исправить, чтобы, если бы я дал коду число 10 в качестве входных данных, он напечатал бы 10-е число в последовательности Фибоначчи? Объяснение и то, как это исправить, было бы очень полезно, и если бы кто-нибудь из вас мог дать полезный совет, это было бы потрясающе.


person supersmarty1234    schedule 18.12.2014    source источник


Ответы (6)


Вы можете использовать список, чтобы отслеживать все числа в последовательности, а затем печатать любое число, которое вы хотите. Попробуй это:

number = 1
last = 0
before_last = 0

def Fibonacci(number, last, before_last):
    Question = raw_input('Would you like a List or the Number: ')
    l=[1]
    X = raw_input('Give a number: ')

    if Question == "List":
        print number
        for counter in range(0, int(X) - 1):
            before_last = last
            last = number
            number = before_last + last
            print number

    if Question == "Number":
        for counter in range (0, int(X)):
            before_last = last
            last = number
            number = before_last + last
            l.append(number)
        print l[int(X)-1]

Fibonacci(number, last, before_last)

Выход:

#Would you like a List or the Number: List
#Give a number: 6
#1
#1
#2
#3
#5
#8

#Would you like a List or the Number: Number
#Give a number: 6
#8
person Ujjwal    schedule 18.12.2014

Когда Question == "Number", ваш цикл for повторяет последовательность range (int(X) - 2, int(X) - 1). Когда вы вводите 10 вместо X, это оценивается как range(8, 9), длина которого равна единице. В результате цикл выполняется только один раз. Поскольку в остальном оба цикла одинаковы, а count никогда не используется внутри тела цикла, вы получите тот же результат, как если бы вы запустили другой цикл с X = 1.

В обоих случаях вы хотите перебрать range(0, x-1), накапливая значение следующего числа в последовательности на каждой итерации. Единственная разница заключается в том, печатаете ли вы окончательный результат или также печатаете промежуточные значения.

Сохраняя существующую структуру вашего кода нетронутой, это так же просто, как:

if Question == "Number":
    for counter in range (0, int(X) - 1): # Loop over the same range
        before_last = last
        last = number
        number = before_last + last
    print number # But print the number outside the loop

Вы можете заметить, что ваш код, вероятно, не совсем такой, каким его написал бы опытный программист. Все нормально. Вы только начинаете, и вам предстоит многому научиться. Я не хочу загружать вас подробностями. Однако для начала, я думаю, вам следует подумать о перемещении переменных number, last и before_last в функцию Fibonacci (т. е. сделать их локальными для функции, удалив как параметры функции, так и глобальные переменные). Есть и другие улучшения, которые вы могли бы внести (некоторые из которых могут быть упомянуты в других ответах), но начните с этого.

person Nathan Davis    schedule 18.12.2014

Это решение может пролить свет на вашу проблему и помочь решить ее.

Question = raw_input("Enter Type: ")
num = raw_input("Terms: ")
def fibonacci(n):
    if n <= 1:
        return n
    else:
        print(fibonacci(n-1) + fibonacci(n-2))



# take input from the user
if Question == "List":
    for counter in range(0, int(num)):
        print fibonacci(counter)
#find specific number in list and print it out
if Question == "Number":
    if(num < 2):
        return num:
    else:
        for n in range(num):
            print(fibonacci(n)[num]) 

Извините, я не использовал Python в течение 2 лет, я просто нашел этот вопрос интересным

Источник -> Ссылка

person Irrational Person    schedule 18.12.2014
comment
Также постарайтесь исправить синтаксические ошибки, которые я не смог исправить из-за компилятора. - person Irrational Person; 18.12.2014

Вы можете попробовать использовать рекурсивную функцию следующим образом:

def fib(x):
    if x<2:
            return x
    return fib(x-2) + fib(x-1)

Затем вы можете изменить свои операторы if на эти.

if Question == "List":
    for counter in range(0, int(X)):
        print fib(counter)
if Question == "Number":
    print fib(X)

Затем вы можете рассчитать каждое значение ряда Фибоначчи, используя это, в зависимости от того, нужно ли вам число или список.

person meyer9    schedule 18.12.2014

Ваш код печатает только одно число, потому что диапазон всегда равен 1. например. диапазон (int(X) - 2, int(X) - 1) всегда будет равен 1.

person Joel Gregory    schedule 18.12.2014

Там есть ответ о том, как вы могли бы выполнить последовательность выдумок, но ваша фактическая ошибка была в этой строке:

for counter in range (int(X) - 2, int(X) - 1):

То, что на самом деле должно быть, исходит из

range(0, int(X) - 1):

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

person TravelingMaker    schedule 18.12.2014