Как распечатать последовательность Фибоначчи до 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.
обратите внимание, что в вызове
- вы не вызываете fib() рекурсивно
 - вам нужен метод оболочки, чтобы вход не запрашивался каждый раз, когда метод вызывается рекурсивно
 - вам не нужно отправлять список. Достаточно просто числа 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