Python 3.x 为什么在尝试对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

我定义了一个函数来计算fibonacci数,效果很好


现在,我尝试将代码中的所有偶数斐波那契数相加:

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')。我会试着让我的头绕过他们。。。