Python 前n个斐波那契数之和
我编写了一个程序来查找前N个fibonacci数的和,但它返回了一个UnboundLocalErrorPython 前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_
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
为1的错误情况)x
- 内部循环不会修改
或num1
,因此您将继续添加相同的值。结合第一个问题,您应该将分配移动到循环中的num2
和num1
num2
- 前两个斐波那契数不是1和2,而是0和1。所以用
初始化。另见li=[0,1]
- 当
为1时,执行也会继续进入x
块。如果用else
更改第二个elif
,则不会发生这种情况If
- 您可能还应该处理
为0时的情况x
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