Python 3.x 为什么在尝试对Fibonacci数求和时没有答案
我定义了一个函数来计算fibonacci数,效果很好Python 3.x 为什么在尝试对Fibonacci数求和时没有答案,python-3.x,while-loop,fibonacci,Python 3.x,While Loop,Fibonacci,我定义了一个函数来计算fibonacci数,效果很好 现在,我尝试将代码中的所有偶数斐波那契数相加: if fib_iterative(n) % 2 == 0: total += fib_iterative(n) n += 1 只有当第n个斐波那契数为偶数时,该值才会递增。这意味着,一旦你到达1,它就会变成一个无限循环。如果在while和If语句之间立即放置一个print(n),您将看到这一点-它将打印出0,然后是大量的1s(可能直到您感到厌烦并强制停止) 要修复它,您需要将n
现在,我尝试将代码中的所有偶数斐波那契数相加:
if fib_iterative(n) % 2 == 0:
total += fib_iterative(n)
n += 1
只有当第n个斐波那契数为偶数时,该值才会递增。这意味着,一旦你到达1
,它就会变成一个无限循环。如果在while
和If
语句之间立即放置一个print(n)
,您将看到这一点-它将打印出0
,然后是大量的1
s(可能直到您感到厌烦并强制停止)
要修复它,您需要将n+=1
缩进级别调回一个缩进级别,以便无论以下情况,它都会递增:
if fib_iterative(n) % 2 == 0:
total += fib_iterative(n)
n += 1
关于守则:
if fib_iterative(n) % 2 == 0:
total += fib_iterative(n)
n += 1
只有当第n个斐波那契数为偶数时,该值才会递增。这意味着,一旦你到达1
,它就会变成一个无限循环。如果在while
和If
语句之间立即放置一个print(n)
,您将看到这一点-它将打印出0
,然后是大量的1
s(可能直到您感到厌烦并强制停止)
要修复它,您需要将n+=1
缩进级别调回一个缩进级别,以便无论以下情况,它都会递增:
if fib_iterative(n) % 2 == 0:
total += fib_iterative(n)
n += 1
您的代码不起作用,因为直到
n
,您才开始执行它,直到4000000
您可以将这两个函数组合起来来创建它
def sum_even_fibs(n):
a, b = 0, 1
t = 0
for i in range(n):
a, b = b, a + b
if a % 2 == 0:
t += a
return t
print(sum_even_fibs(10)) #44
正如有人在评论中指出的那样,每三分之一的数字是偶数,所以你可以将其压缩为
def sum_even_fibs(n):
a, b = 0, 1
t = 0
for i in range(n // 3):
a, b = a + 2 * b, 2 * a + 3 * b
t += a
return t
print(sum_even_fibs(10)) #44
对于不希望执行任何超过4000000的数字的特定情况,可以添加此if语句
def sum_even_fibs(n):
a, b = 0, 1
t = 0
for i in range(n // 3):
a, b = a + 2 * b, 2 * a + 3 * b
if a >= 4000000:
print("the fibonacci numbers in this calculation exceed 4000000")
return None
t += a
return t
您的代码不起作用,因为直到
n
,您才开始执行它,直到4000000
您可以将这两个函数组合起来来创建它
def sum_even_fibs(n):
a, b = 0, 1
t = 0
for i in range(n):
a, b = b, a + b
if a % 2 == 0:
t += a
return t
print(sum_even_fibs(10)) #44
正如有人在评论中指出的那样,每三分之一的数字是偶数,所以你可以将其压缩为
def sum_even_fibs(n):
a, b = 0, 1
t = 0
for i in range(n // 3):
a, b = a + 2 * b, 2 * a + 3 * b
t += a
return t
print(sum_even_fibs(10)) #44
对于不希望执行任何超过4000000的数字的特定情况,可以添加此if语句
def sum_even_fibs(n):
a, b = 0, 1
t = 0
for i in range(n // 3):
a, b = a + 2 * b, 2 * a + 3 * b
if a >= 4000000:
print("the fibonacci numbers in this calculation exceed 4000000")
return None
t += a
return t
假设您在
n=5
之前正在执行此操作。你应该计算五个斐波那契数。相反,你要计算所有的斐波那契数直到当前的三次!对于每个n
,您应该准确地调用fib\u iterative
一次并重用结果。您还将丢弃n
参数的值
def sum_even_fibs(n):
total = 0
for x in range(n):
current = fib_iterative(x)
if current > 4000000:
break
if not current % 2:
total += current
return total
这仍然是低效的,因为每次调用fib\u迭代(n)
时都要重新计算n-1
值。相反,基于生成器的解决方案将允许您只计算每个值一次
from itertools import takewhile
def fib(n):
x = 0
y = 1
for _ in range(n):
yield x
x, y = y, x+y
def sum_even_fibs(n):
fibs = fib(n)
evens = (x for x in fibs if not x%2)
less_than_4000000 = takewhile(lambda x: x < 4000000, evens)
return sum(less_than_4000000)
从itertools导入takewhile
def纤维(n):
x=0
y=1
对于范围内的u(n):
产量x
x、 y=y,x+y
定义和偶数fibs(n):
fibs=fib(n)
evens=(如果不是x%2,则x代表fibs中的x)
小于4000000=takewhile(λx:x<4000000,偶数)
回报总额(少于400万欧元)
假设您刚刚在n=5
之前完成了此操作。你应该计算五个斐波那契数。相反,你要计算所有的斐波那契数直到当前的三次!对于每个n
,您应该准确地调用fib\u iterative
一次并重用结果。您还将丢弃n
参数的值
def sum_even_fibs(n):
total = 0
for x in range(n):
current = fib_iterative(x)
if current > 4000000:
break
if not current % 2:
total += current
return total
这仍然是低效的,因为每次调用fib\u迭代(n)
时都要重新计算n-1
值。相反,基于生成器的解决方案将允许您只计算每个值一次
from itertools import takewhile
def fib(n):
x = 0
y = 1
for _ in range(n):
yield x
x, y = y, x+y
def sum_even_fibs(n):
fibs = fib(n)
evens = (x for x in fibs if not x%2)
less_than_4000000 = takewhile(lambda x: x < 4000000, evens)
return sum(less_than_4000000)
从itertools导入takewhile
def纤维(n):
x=0
y=1
对于范围内的u(n):
产量x
x、 y=y,x+y
定义和偶数fibs(n):
fibs=fib(n)
evens=(如果不是x%2,则x代表fibs中的x)
小于4000000=takewhile(λx:x<4000000,偶数)
回报总额(少于400万欧元)
备注:奇数+奇数=偶数,偶数+奇数=奇数,因此偶数斐波那契数表示n%3==2。备注:奇数+奇数=偶数,偶数+奇数=奇数,因此偶数斐波那契数表示n%3==2。谢谢!这非常有效,但我无法理解如何仅返回@newc00der的情况下的答案。如果n大于4000000,您希望函数返回什么?什么都没有?一条写着“此计算中的斐波那契数超过4000000”的消息,谢谢!这非常有效,但我无法理解如何仅返回@newc00der的情况下的答案。如果n大于4000000,您希望函数返回什么?什么都没有?一条写着“此计算中的斐波那契数超过4000000”的消息,谢谢!一些我从未见过的东西('itertools','takewhile',yield','lambda')。我会试着让我的头绕过他们…谢谢!一些我从未见过的东西('itertools','takewhile',yield','lambda')。我会试着让我的头绕过他们。。。