我在接受采访时得到了这个问题。所以,在我看来,这是一个混乱的斐波纳契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行代码时,您会推断出什么?没有调试。
答案 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(我只是猜测那个数字),那么它将需要“永远”才能运行。