如何在JavaScript中跟踪fibonacci递归函数

时间:2018-03-18 19:32:40

标签: javascript recursion fibonacci

我正在为fibonacci序列编写递归函数,并希望使用计数器来跟踪递归调用,即完成此函数需要多少次调用

在这种情况下它是15。

enter image description here

fibonacci(num) {
  if(num<2) {
    return num;
  }
  return fibonacci(num-1)+fibonacci(num-2);}

我理解这个函数真的很有名,从运行时的角度来看,它不是解决斐波那契数列的最佳方法。

我仍然很难打印出所花费的步数

3 个答案:

答案 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时,我们使用n1计数继续。在归纳的情况下,n为2或更高,因此我们为fibn - 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)
      })
    })
}