我正在为fibonacci序列编写递归函数,并希望使用计数器来跟踪递归调用,即完成此函数需要多少次调用
在这种情况下它是15。
fibonacci(num) {
if(num<2) {
return num;
}
return fibonacci(num-1)+fibonacci(num-2);}
我理解这个函数真的很有名,从运行时的角度来看,它不是解决斐波那契数列的最佳方法。
我仍然很难打印出所花费的步数
答案 0 :(得分:1)
let counter = 0;
function fibonacci(num) {
counter++;
if(num < 2) { return num; }
return fibonacci(num-1)+fibonacci(num-2);
}
console.log(counter);
答案 1 :(得分:0)
let counter = 0;
function fibonacci(num) {
counter++;
if(num < 2) { return num; }
return fibonacci(num-1)+fibonacci(num-2);
}
fibonacci(5);// if number is 5
console.log('Number of Times '+ counter);
答案 2 :(得分:0)
一个令人惊讶的方法是使用延续传递方式
我们添加延续参数k
并为其指定默认值console.log
。在基本情况下,当n
小于2时,我们使用n
和1
计数继续。在归纳的情况下,n
为2或更高,因此我们为fib
和n - 1
调用n - 2
,在延续中捕获每个的返回值,最后调用使用合并结果输入延续,为当前+ 1
n
您还会注意到它不需要全局变量
const fib = (n = 0, k = console.log) =>
n < 2
? k (n, 1)
: fib (n - 1, (a, aCount) =>
fib (n - 2, (b, bCount) =>
k (a + b, aCount + bCount + 1)))
for (let i = 0; i < 10; i = i + 1)
fib (i)
// 0 1
// 1 1
// 1 3
// 2 5
// 3 9
// 5 15 <this is your test case>
// 8 25
// 13 41
// 21 67
// 34 109
默认的延续只是记录到控制台,但是我们可以提供自己的延续来对结果做一些更有趣的事情 - 这也是一种用于模拟多个值返回的技术
for (let n = 0; n < 10; n = n + 1)
fib (n, (res, count) =>
console.log ("after %d computations, fib (%d) returned %d", count, n, res))
// after 1 computations, fib (0) returned 0
// after 1 computations, fib (1) returned 1
// after 3 computations, fib (2) returned 1
// after 5 computations, fib (3) returned 2
// after 9 computations, fib (4) returned 3
// after 15 computations, fib (5) returned 5
// after 25 computations, fib (6) returned 8
// after 41 computations, fib (7) returned 13
// after 67 computations, fib (8) returned 21
这是使用较早的function
语法
const fib = function (n = 0, k = console.log) {
if (n < 2)
return k (n, 1)
else
return fib (n - 1, function (a, aCount) {
return fib (n - 2, function (b, bCount) {
return k (a + b, 1 + aCount + bCount)
})
})
}