尝试使用递归来解决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
作为计数器和 curr
和 prev
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数(不使用全局变量)
Java斐波那契数列(Fibonacci Sequence兔子数列)的3种计算方法(递归实现递归值缓存实现循环实现)