Как распечатать последовательность Фибоначчи до n-го числа в Python?

У меня есть домашнее задание, которое я в тупике. Я пытаюсь написать программу, которая выводит последовательность Фибоначчи на N-е число. Вот что у меня пока есть:

def fib():
   n = int(input("Please Enter a number: "))

   if n == 1:
      return(1)
   elif n == 0:   
      return(0)            
   else:                      
      return (n-1) + (n-2)


mylist = range[0:n]
print(mylist)

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

7 ответов


нерекурсивное решение

def fib(n):
    cur = 1
    old = 1
    i = 1
    while (i < n):
        cur, old, i = cur+old, cur, i+1
    return cur

for i in range(10):
    print(fib(i))

генератор решение:

def fib(n):
    old = 0
    cur = 1
    i = 1
    yield cur
    while (i < n):
        cur, old, i = cur+old, cur, i+1
        yield cur

for f in fib(10):
    print(f)

обратите внимание, что решение генератора превосходит нерекурсивное (и нерекурсивное превосходит рекурсивное, если memoization не применяется к рекурсивному решению)

еще раз, рекурсивно с memoization:

def memoize(func):
    memo = dict()
    def decorated(n):
        if n not in memo:
            memo[n] = func(n)
        return memo[n]

    return decorated

@memoize
def fib(n):
    #added for demonstration purposes only - not really needed
    global call_count
    call_count = call_count + 1
    #end demonstration purposes

    if n<=1:
        return 1
    else:
        return fib(n-1) + fib(n-2)

call_count = 0 #added for demonstration purposes only - not really needed
for i in range(100):
    print(fib(i))
print(call_count) #prints 100

в этот раз каждого количество fibbonacci из расчета ровно один раз, и чем хранится. Таким образом, это решение превзойдет все остальной. Однако реализация декоратора просто быстрая и грязная, не впускайте его в производство. (см. этот удивительный вопрос на SO для деталей о декораторах python:)

С fib определено, программа будет чем-то вроде (извините, просто цикл скучен, вот еще несколько классных вещей python: списочные включения)

fib_n = int(input("Fib number?"))
fibs = [fib(i) for i in range(fib_n)]
print " ".join(fibs) 

печатает все числа в одной строке, разделенных пробелами. Если ты хочешь, чтобы каждый был сам по себе. строка-заменить " " С "\n"


def fibonacci(n):
  if n <= 1:
    return n
  else:
    return fibonacci(n-1) + fibonacci(n-2)

print(fibonacci(int(input())))

и так как вы хотите печатать до n - го числа:

[print(fibonacci(n)) for n in range (int(input()))]

и для python2.7 изменение input to raw_input.


обратите внимание, что в вызове

  1. вы не вызываете fib() рекурсивно
  2. вам нужен метод оболочки, чтобы вход не запрашивался каждый раз, когда метод вызывается рекурсивно
  3. вам не нужно отправлять список. Достаточно просто числа n.

этот метод даст вам только N-е число в последовательности. Он не печатает последовательность.

вам нужно return fib(n-1) + fib(n-2)

def f():
    n = int(input("Please Enter a number: "))
    print fib(n)

def fib(n):    
    if n == 0: 
        return 0
    elif n == 1: 
        return 1
    else: 
        return fib(n-1)+fib(n-2)

def fib(n):
   if n == 1:
      return(1)
   elif n == 0:   
      return(0)            
   else:                      
      return fib(n-1) + fib(n-2)

my_num = int(input("Enter a number:"))
print fib(my_num)

Я не совсем уверен, что ваш вопрос... но ответ, вероятно, что-то вроде этого


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

рекурсивно::

def fib(n):
    if n == 1:
        return (1);
    elif n == 0:
        return (0);
    else:
        return fib(n-1) + fib(n-2);

def callFib():
    n = int(raw_input('Enter n::\t'));
    mylist = fib(n);
    print mylist;

callFib();

итерационно::

def fib():
    n = int(raw_input('Enter n::\t'));
    terms = [0,1];
    i=2;
    while i<=n:
        terms.append(terms[i-1] + terms[i-2]);
        i=i+1;
    print terms[n];

fib();

рекурсивного решения:

def fib(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fib(n-1) + fib(n-2)
x=input('which fibonnaci number do you want?')
print fib(x)

объяснение: если n равно 0, то, конечно, "0-й" член равен 0,а 1-й-один. Отсюда вы знаете, что следующие числа будут суммой предыдущих 2. Это то, что вытекает после другого.


Это может быть быстрее, если длинный список

# Get nth Fibonacci number 
def nfib(nth):
  sq5 = 5**.5
  phi1 = (1+sq5)/2
  phi2 = -1 * (phi1 -1)
  resp = (phi1**(nth+1) - phi2**(nth+1))/sq5
  return long(resp)

for i in range(10):
  print i+1, ": ",  nfib(i)

выход

1 :  1
2 :  1
3 :  2
4 :  3
5 :  5
6 :  8
7 :  13
8 :  21
9 :  34
10 :  55