Python 前n个斐波那契数之和

Python 前n个斐波那契数之和,python,python-3.x,Python,Python 3.x,我编写了一个程序来查找前N个fibonacci数的和,但它返回了一个UnboundLocalError def fib_list(x): if x == 1: li = [1] if x == 2: li = [1,2] else: num1 = li[-1] num2 = li[-2] li = [1,2] for n in range(2,x): li.append(num1+num2) return li def fib_

我编写了一个程序来查找前N个fibonacci数的和,但它返回了一个UnboundLocalError

def fib_list(x):
 if x == 1:
    li = [1]
 if x == 2:
    li = [1,2]
 else:
    num1 = li[-1]
    num2 = li[-2]
    li = [1,2]
    for n in range(2,x):
     li.append(num1+num2)
 return li

def fib_sum(x):
 sum = 0
 listy = fib_list(x)
 for n in listy:
    sum += n
 return sum

print("You want the sum of how many fib numbers?")
num = int(input())
print(fib_sum(num))
几个问题:

  • 错误是由
    num1=li[-1]
    引起的:此时您尚未给出
    li
    值(除了
    x
    为1的错误情况)

  • 内部循环不会修改
    num1
    num2
    ,因此您将继续添加相同的值。结合第一个问题,您应该将分配移动到循环中的
    num1
    num2

  • 前两个斐波那契数不是1和2,而是0和1。所以用
    li=[0,1]
    初始化。另见

  • x
    为1时,执行也会继续进入
    else
    块。如果用
    elif
    更改第二个
    If
    ,则不会发生这种情况

  • 您可能还应该处理
    x
    为0时的情况

综上所述,你会得到:

def fib_list(x):
    if x == 0:
        li = []
    elif x == 1:
        li = [0]
    elif x == 2:
        li = [0,1]
    else:
        li = [0,1]
        for n in range(2,x):
            num1 = li[-1]
            num2 = li[-2]
            li.append(num1+num2)
    return li
当然,可以更简洁地写下这句话:

def fib_list(x):
    li = [0,1]
    if x <= 2:
        return li[:x]
    for n in range(x-2):
        li.append(sum(li[-2:]))
    return li

您可以对斐波那契数使用生成器函数,对于较大的输入,该函数的性能优于附加到列表。使用生成器可以很容易地生成求和函数

def fibonacci(n):
    x, y = 0, 1
    for _ in range(n):
        yield x
        x, y = y, x + y

def fib_sum(n):
    return sum(fibonacci(n))

print("You want the sum of how many fib numbers?")
num = int(input())
print(fib_sum(num))
运行时,输入
6
,输出:

You want the sum of how many fib numbers?
6
12

写这个
li=[1,2]
,因为第一个语句是
否则你的逻辑也错了你没有更新
num1
num2
,开始值应该是
[1,1
]而不是
[1,2]
。你用你的错误代码使简单的程序变得非常复杂logic@HeapOverflow这将有助于@deadshot感谢您阅读我的代码。对不起,如果我之前不清楚的话。虽然num1和num2不会直接更新,但在范围(2,x)中的每次迭代之后,列表中还有1个项目(追加),因此num1和num2会间接更新。我得到的错误是UnboundLocalError,我找不到我的代码哪里出错了。谢谢:)看我的第一条评论谢谢很多我的问题已经完全解决:)因为我还在学习我还没有遇到发电机,但我一定会在学习后尝试这种方法。谢谢您的时间:)
def fibonacci(n):
    x, y = 0, 1
    for _ in range(n):
        yield x
        x, y = y, x + y

def fib_sum(n):
    return sum(fibonacci(n))

print("You want the sum of how many fib numbers?")
num = int(input())
print(fib_sum(num))
You want the sum of how many fib numbers?
6
12