为什么while一直在这里循环播放?有人可以解释吗?

时间:2019-07-12 10:36:23

标签: python

我有以下代码来生成斐波那契数列直到'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

7 个答案:

答案 0 :(得分:3)

您正在调用loop函数,还调用了fibo函数。您只需要使用一个,即可将此功能与ifrecursion配合使用:

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

这是预期的输出吗?