斐波那契 - 使用递归仅查找偶数的总和 [关闭]

Posted

技术标签:

【中文标题】斐波那契 - 使用递归仅查找偶数的总和 [关闭]【英文标题】:Fibonacci - Find the sum only of even numbers using recursion [closed] 【发布时间】:2022-01-20 05:11:08 【问题描述】:

我遇到了这个任务:

斐波那契数列中的每个新项都是通过添加前两项来生成的。从 1 和 2 开始,前 10 个术语将是:

0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...

通过考虑斐波那契数列中值不超过四百万的项,求偶数项之和。

使用递归计算斐波那契数的解决方案将获得最高分。"

我知道如何计算斐波那契数列。 return fib(n-1)+fib(n-2).

逻辑上求偶数总和是每次检查if (curr%2==0) sum+=curr

但我不知道如何设置 4000000 的限制。使用递归不清楚。在递归中,我们需要有初始值,该值将被减小,以及它返回值的基本情况。

您能解释一下如何使用 4000000 的限制并在递归中实现吗?

    c=0:0,1:1
    sum=0;
    def Fib(self,n=5):
        if n in self.c:
            return self.c[n]
        self.c[n]=self.Fib(n-1)+self.Fib(n-2)
        return self.c[n]

上面的 Python 实现

【问题讨论】:

你能发布你的递归函数吗? 我同意。请向我们展示您目前获得的代码。 你在问java。请向我们展示您的 java 代码。我们不是来做你的功课的。 【参考方案1】:

这是一种有趣的非递归方法,使用 Streams 懒惰地生成斐波那契数列并对 400 万以下的偶数求和:

import java.util.stream.*;

class Fib 
    public static void main(String[] args) 
        int sum =
            Stream.iterate(new int[]0, 1,
                           t -> new int[]t[1], t[0] + t[1])
            .mapToInt(t -> t[0])
            .filter(n -> n % 2 == 0)
            .takeWhile(n -> n <= 4000000)
            .sum();
        System.out.println("Sum of even fibonacci numbers under 4 million: "
                           + sum);
    

可能不可接受作为家庭作业的答案,但可以通过将问题分解为各个步骤的管道来了解更高级的方法来解决问题。

递归方法(实际代码留给学生练习):一个将斐波那契数列的前两项作为参数的函数(所以从 0 和 1 开始),以及第三个求和参数(最初为 0)。使用前面的项来计算新的数字。如果是偶数,则加到总和中。如果小于 400 万,则使用新条款和新总和进行递归。如果大于,你就完成了;返回总和。

【讨论】:

【参考方案2】:

4000000 的限制与 fib 函数本身无关。您只需要检查该函数的结果是否小于 4000000。所以可能是这样的:

int sum = 0;
int i = 1;
int value = fib(i);
while(value < 4000000) 
    if (value % 2 == 0) sum += value;
    i++;
    value = fib(i);

//sum contains the answer here

有很多更有效的方法可以做到这一点,但这应该会为您解答

【讨论】:

您建议的代码非常效率低下,但无论如何 @akuzminykh 这就是我自己已经指出的。无需提及。但对于初学者来说,这是最直接、最容易理解的方法 此外,效率主要取决于 fib 函数本身。例如,可以通过缓存提高效率 我认为,对初学者最友好和最直接的例子就是在 for 循环中计算斐波那契,并在同一个循环中检查其他内容。这也会更有效率。 可以使用递归函数“模拟”循环。 :D

以上是关于斐波那契 - 使用递归仅查找偶数的总和 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

go 实现几个递归经典案例(阶乘斐波那契数列二分查找汉诺塔)

用C语言编写斐波那契数列前10项(用简单的方法且只有两个变量)()非递归方法

什么是递归?怎么用它来实现斐波那契数列?

类似斐波那契数列的递归

算法斐波那契(黄金分割法) 查找算法

编写一递归函数求斐波那契数列的前40项