尝试使用递归来解决Fibonacci问题(javascript)。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了尝试使用递归来解决Fibonacci问题(javascript)。相关的知识,希望对你有一定的参考价值。

这就是问题所在:

给定一个正整数num,返回所有小于或等于num的奇数斐波那契数之和。

斐波那契数列的前两个数是1和1,数列中的每一个附加数都是前两个数的和。斐波那契序列的前六个数字是1、1、2、3、5和8。

例如,sumFibs(10)应该返回10,因为所有小于或等于10的奇数斐波那契数都是1、1、3和5。

这就是我所尝试的

function sumFibs(num,  total = [1, 1], n = (total.length - 1 + total.length - 2)) {

if(n == num){
return total;
}

total.push(n);

sumFibs(num, n = (total.length - 1 + total.length - 2), total);

};

问题

是否可以用我的方法来实现,如果可以,如何解决语法问题?如果不能,你会如何解决这个问题。

非常感谢!

答案

四件事

(1)你没有返回递归调用的结果,因此它永远不会传递给调用者。

sumFibs(4, [1, 1]) -> sumFibs(4, [1, 1, 2]) -> sumFibs(4, [1, 1, 2, 3])
                                            <- [1, 1, 2, 3]
//                                           v the return you do
//                 v the return you need too

(2) 在递归调用中,参数的顺序是错误的。

(3)我猜测你不是取数组的长度减1,而是想访问该位置的属性在 total 阵列。

(4)为什么你实际上 n 作为论据?因为它只取决于 total,也可以只是一个变量。

function sumFibs(num,  total = [1, 1]) {
  const n = total[total.length - 1] + total[total.length - 2];
  if(n > num){
    return total;
  }

  total.push(n);

  return sumFibs(num, total);
}

console.log(sumFibs(19));
另一答案

继续传递风格

继续传递风格有效地给你提供了程序化的 return. 递归地使用CPS函数可以使程序的复杂性蒸发得无影无踪------。

const identity = x =>
  x

const sumfib = (n = 0, then = identity) =>
  n <= 0
    ? then(0, 1, 1)  // base case
    : sumfib         // inductive: solve smaller subproblem
        ( n - 1
        , (sum, fib, temp) =>
            then(sum + fib, temp, fib + temp)
        )

console.log
  ( sumfib(0) //  0 = 0
  , sumfib(1) //  1 = 0 + 1
  , sumfib(2) //  2 = 0 + 1 + 1
  , sumfib(3) //  4 = 0 + 1 + 1 + 2
  , sumfib(4) //  7 = 0 + 1 + 1 + 2 + 3
  , sumfib(5) // 12 = 0 + 1 + 1 + 2 + 3 + 5
  , sumfib(6) // 20 = 0 + 1 + 1 + 2 + 3 + 5 + 8
  , sumfib(7) // 33 = 0 + 1 + 1 + 2 + 3 + 5 + 8 + 13
  )
另一答案

这可以不用数组累加器来解决,使用 n 作为计数器和 currprev vars来存储计算斐波那契数列所需的数据。每当我们有一个奇数的 curr把它加到运行的总数中,然后把它传到调用栈中。

const sumOddFibs = (n, curr=1, prev=0) => {
  if (curr < n) {    
    return sumOddFibs(n, curr + prev, curr) + (curr % 2 ? curr : 0);
  }
  
  return 0;
};

console.log(sumOddFibs(10));

以上是关于尝试使用递归来解决Fibonacci问题(javascript)。的主要内容,如果未能解决你的问题,请参考以下文章

利用JavaScript打印出Fibonacci数(不使用全局变量)

hau1021 Fibonacci Again(递归)

Java斐波那契数列(Fibonacci Sequence兔子数列)的3种计算方法(递归实现递归值缓存实现循环实现)

递归算法

简单说明什么是递归?什么情况会使用?并使用java实现一个简单的递归程序。

算法分析三:分治策略