[英]How do I print a fibonacci sequence to the nth number in 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)
我想我可以使用单独的函数,但我不知道如何传递计算斐波那契数列的参数。 然后下一步是打印出直到该数字的数字序列。
非递归解决方案
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)
请注意,生成器解决方案优于非递归(并且非递归优于递归,如果记忆未应用于递归解决方案)
再一次,通过记忆递归:
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 上的这个惊人问题:)
因此,定义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
更改为raw_input
。
请注意,在您的通话中
这种方法只会给你序列中的第 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)
如果列表很长,这可能会更快
# 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
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 项为 1。 从这里,您知道下一个数字将是前两个数字的总和。这就是 else 之后的行推断出的。
看起来您可能正在尝试解决与我相同的作业问题,您实际上不需要用户输入。 您只需在调用函数时传入参数。
def compute_nth_fib(num):
if num == 0:
return 0
elif num == 1:
return 1
else:
return compute_nth_fib(num-1) + compute_nth_fib(num-2)
#test with different parameters
print(compute_nth_fib(3))
希望这对某人有帮助!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.