我有一份我难以理解的家庭作业。我正在尝试编写一个程序,在第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)
我想我可以使用单独的函数,但我无法弄清楚如何传递计算斐波纳契数列的参数。然后下一步是打印出该数字的数字序列。
答案 0 :(得分:17)
非递归解决方案
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数字计算完全一次,然后存储。因此,这个解决方案将胜过其余所有。然而,装饰器实现只是快速而肮脏,不要让它投入生产。 (有关python装饰器的详细信息,请参阅SO上的this amazing question:)
所以,如果定义了fib
,程序就会像(抱歉,循环很无聊,这里有一些更酷的python东西:list comprehensions)
fib_n = int(input("Fib number?"))
fibs = [fib(i) for i in range(fib_n)]
print " ".join(fibs)
这会打印一行中的所有数字,用空格分隔。如果您希望每个人都有自己的行 - 请将" "
替换为"\n"
答案 1 :(得分:5)
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
更改为raw_input
。
答案 2 :(得分:3)
请注意,在您的通话中
此方法仅提供序列中的第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)
答案 3 :(得分: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)
我不确定你的问题是什么......但答案可能是这样的
答案 4 :(得分:2)
单独的函数最好,因为递归函数更容易处理。另一方面,您可以编写一个只需要一个参数的迭代函数
递归::
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();
答案 5 :(得分:2)
用于递归解决方案:
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,则当然'0th'项为0,第1项为1。从这里开始,您知道下一个数字将是前一个数字的总和。这就是在else之后的行所推断的。
答案 6 :(得分: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)