我有以下代码来生成斐波那契数列直到'num'
def fibo(num,a=0,b=1):
while b <= num:
print(b)
a, b = b, a+b
fibo(num,a,b)
fibo(30)
下面是输出。但是,如果我在代码中使用“ if”而不是“ while”,则可以正常工作。但是我想知道这里的问题是什么。
1
1
2
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
2
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
1
2
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
2
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
3
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
5
8
13
21
21
13
21
21
8
13
21
21
13
21
21
答案 0 :(得分:3)
您正在调用loop
函数,还调用了fibo
函数。您只需要使用一个,即可将此功能与if
和recursion
配合使用:
def fibo(num,a=0,b=1):
if b <= num:
print(b)
a, b = b, a+b
fibo(num,a,b)
等于while
和没有 recursion
的函数:
def fibo(num,a=0,b=1):
while b <= num:
print(b)
a, b = b, a+b
基本上,如果同时保留它们,则将在循环的每个循环中调用fibo
函数,并且每次调用都会创建一个新的循环,在该循环中将一次又一次地调用它。
在Python中最好使用迭代函数而不是递归函数。这是因为Python 不不优化tail-recursion
。
答案 1 :(得分:1)
您在while循环顶部使用了递归。可以这样做:
def fibo(num,a=0,b=1):
if b <= num: #Version with recursion
print(b)
a, b = b, a+b
fibo(num,a,b)
或者像这样:
def fibo(num,a=0,b=1): #Version without recursion but with a while-loop
while b <= num:
print(b)
a, b = b, a+b
答案 2 :(得分:0)
这是因为您正在按值进行调用。只需删除递归函数调用,然后尝试再次运行
答案 3 :(得分:0)
2种可能的实现方式是:
def fibo(num,a=0,b=1):
while b <= num:
print(b)
a, b = b, a+b
fibo(30)
或:
def fibo(num,a=0,b=1):
if b <= num:
print(b)
a, b = b, a+b
fibo(num,a,b)
fibo(30)
在第二个示例中,您将递归性与中断条件一起使用来停止迭代,因此使用if condition
来停止程序。在第一个程序中,程序循环运行直至达到条件。无需递归(再次调用fibo)。
答案 4 :(得分:0)
def fibo(num,a=0,b=1):
while b <= num:
print(b)
a, b = b, a+b
fibo(30)
因为您正在使用递归函数并一次又一次地调用函数
答案 5 :(得分:0)
您在代码中混合了递归和迭代方法,因此请尝试使用具有迭代功能且无递归的版本:
def fibo(num,a=0,b=1):
while b <= num:
print(b)
a, b = b, a+b
fibo(30)
或使用递归且不进行迭代(即,仅执行一次分配,而不是循环执行):
def fibo(num,a=0,b=1):
if b <= num:
print(b)
a, b = b, a+b
fibo(num,a,b)
fibo(30)
答案 6 :(得分:0)
尝试一下。
b = 1
a = 0
def fibo(num):
global a, b
while b <= num:
print(b)
a, b = b, a+b
fibo(num)
fibo(30)
这将给出如下输出。
1
1
2
3
5
8
13
21
这是预期的输出吗?