这个递归函数有什么作用?

时间:2010-09-08 08:45:22

标签: recursion fibonacci

我在接受采访时得到了这个问题。所以,在我看来,这是一个混乱的斐波纳契seq。 sum生成器,这给出了stackoverflow。因为if(n==0) should be if(n<3)(退出条件错误)。这个问题的确切答案应该是什么?期待什么作为答案?

foo (int n) {
if (n == 0) return 1;
return foo(n-1) + foo(n-2);
}

更新

这个递归函数有什么作用?

当您看到这3行代码时,您会推断出什么?没有调试。

5 个答案:

答案 0 :(得分:5)

是的,它只是一个带有不正确基本情况的递归Fibonacci方法(虽然我认为我不会使用n < 3 ...这取决于你如何定义它。)

至于“预期的答案” - 这取决于问题。您是否在帖子的标题中问了完全的问题?如果是这样,那么答案就是“它会永远地递归,直到它将你的任何值传递给0以外的任何值时 - ”当然还有一个解释。 (它永远不会结束,因为 n-1不是0, n-2不是0,或两者兼而有之。)

编辑:以上回答第一个问题。回答“当你看到这3行代码时你会推断出什么” - 我推断有问题的开发人员从未使用0以外的值运行代码,或者不关心代码是否有效。

答案 1 :(得分:2)

发布代码的问题是,如果我们评估foo(1)我们需要找到foo(0)和foo(-1),foo(-1)则需要找到foo(-2)和foo( -3)等等。这将继续对foo()进行更多调用,直到内存中没有更多空间导致堆栈溢出。对foo进行了多少次调用将取决于调用堆栈的大小,这将是特定于实现的。

当我看到这些代码行时,我立即得到的印象是,编写它的人没有想到可以输入函数的所有可能输入。

为了使foo(1)或负输入不会失败的递归Fibonacci函数得到:

foo (int n) {
  if( n < 0 ) return 0;
  if (n == 0) return 1;
  return foo(n-1) + foo(n-2);
}

编辑:也许负数的回报应该是别的,因为对于负指数没有隐含地定义斐波纳契序列。

但是如果我们使用fib(-n)=( - 1)^(n + 1)fib(n)的扩展名,我们可以得到以下代码:

int fib(int n) {
     if( n == -1){
        return 1;
     }else if ( n < 0 ){ 
        return ( (-1)^(-n+1 ) * fib(-n) );
     }else if (n == 0){
        return 1;
     }else{
        return fib(n-1) + fib(n-2);
     }
}

答案 2 :(得分:0)

假设你调用foo(1),它将有两个子调用foo(0)和foo(-1)。正如你所看到的,一旦你到达foo(-1),n将无限期地减少并且永远不会达到终止条件。

确切的答案是:

foo (int n) {
 if (n <= 1) return 1; // assuming 0th and 1st fib is 1
 return foo(n-1) + foo(n-2);
}

答案 3 :(得分:0)

它是一个递归的斐波纳契函数,第0个元素为1。

答案 4 :(得分:0)

忽略不正确的终止条件,代码是Fibonacci函数的“天真”递归实现。它具有非常差的大O时间复杂度。它适用于小n,但如果n大于50(我只是猜测那个数字),那么它将需要“永远”才能运行。