Как распечатать последовательность Фибоначчи до 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