Python 递归斐波那契级数中的重复

Python 递归斐波那契级数中的重复,python,recursion,Python,Recursion,我正在尝试编写一个方法,使用递归打印第一个nnumbersfibonacci序列。 我不想编写该方法,然后在该方法之后创建一个单独的循环,以打印出第一个nfibonacci系列。我尝试使用try和finally块,因为我知道finally语句将始终执行。fibonacci系列输出工作正常,但不断重复。有可能停止重复吗 def fibonacci(n): if n <= 1: return n try: fib = fibonacci(n-1)

我正在尝试编写一个方法,使用递归打印第一个
n
numbers
fibonacci
序列。
我不想编写该方法,然后在该方法之后创建一个单独的循环,以打印出第一个
n
fibonacci
系列。我尝试使用
try
finally
块,因为我知道
finally
语句将始终执行。
fibonacci
系列输出工作正常,但不断重复。有可能停止重复吗

def fibonacci(n):
    if n <= 1:
        return n
    try:
        fib = fibonacci(n-1) + fibonacci(n-2)
        return fib
    finally:
        print("F{} = {}".format(n, fib))
    
fibonacci(6)

这是可能的,但是您需要有一个非本地值来记住是否已经打印了一个数字。一种简单的方法是使用闭包和本地定义的函数:

def fibonacci(n):
    done = -1
    def fibo(n):
        nonlocal done
        if n <= 1:
            fib = n
        else:
            fib = fibo(n-1) + fibo(n-2)
        if n > done:
            print("F{} = {}".format(n, fib))
            done = n
        return fib
    fibo(n)

您可以使用如下默认参数:

def fibonacci(n, a=1, b=1):
    if n==0:
        return;
    else:
        print(a)
        fibonaci(n-1, b, a+b)

fibonacci(10)

Output:
1
1
2
3
5
8
13
21
34
55

对代码进行相当小的更改将避免不必要的递归,然后只打印(我希望)您想要的内容

def fibonacci(n):

如果n可以将函数设为生成器,并在打印语句中使用解包(如果需要,使用新的行分隔符):

您也可以在函数中使用打印函数,但这就是函数的操作方式:

def fibo(n,a=0,b=1):
    print(a)
    if n>1:fibo(n-1,b,a+b)

fibo(10)

顺便说一句,现代版本的斐波那契数列从零开始

“我不想写这个方法,然后在这个方法之后创建一个单独的循环来打印出第一个n个斐波那契数列”为什么?递归迫使你在每个阶段递归地重新计算2个值。因此,将print语句放在递归函数中会显示一些您不想看到的内容。我会生成这些值,并将结果显示在别处。你可以试试dp备忘录。设置为dict,然后打印dict.@MetallimaX听起来很有用。我可以简单地在外面形成一个单独的循环。只是想知道有没有更好的办法way@deadshot这是每个人都做的事。只是想看看有没有更好的办法
def fibonacci(n, a=1, b=1):
    if n==0:
        return;
    else:
        print(a)
        fibonaci(n-1, b, a+b)

fibonacci(10)

Output:
1
1
2
3
5
8
13
21
34
55
F1 = 1
F2 = 1
F3 = 2
F4 = 3
F5 = 5
F6 = 8
def fibo(n,a=0,b=1):
    yield a
    if n>1:
        yield from fibo(n-1,b,a+b)

print(*fibo(10),sep="\n")

0
1
1
2
3
5
8
13
21
34
def fibo(n,a=0,b=1):
    print(a)
    if n>1:fibo(n-1,b,a+b)

fibo(10)