我正在尝试将扩展添加到Fibonacci数字以考虑负指数。 扩展名为Fib(-n)=( - n)^(n + 1)* Fib(n) 我试图用c ++实现这个,但我遇到了一个问题,我不知道如何绕过它。
#include <iostream>
#include <math.h>
int fib(int n) {
if ( n < 0 ){
return ( pow(-1,-n+1 ) * fib(-n) );
}else if (n == 0){
return 1;
}else{
return fib(n-1) + fib(n-2);
}
}
int main(void){
std::cout << "fib("<< -2<<") = " << fib(-2) << std::endl;
return 0;
}
这给了我一个段错误,知道为什么会这样吗?
编辑: 我弄清楚问题是什么。忘了一个基本情况,这导致了一个无限递归,这反过来导致了一个段错误。
答案 0 :(得分:4)
我想当你拨打fib(-2)
时,它会调用fib(2)
fib(2)
来电fib(1)
和fib(0)
fib(1)
来电fib(0)
和fib(-1)
fib(-1)
调用fib(1)
,这是永无止境的循环
答案 1 :(得分:1)
这将导致无限递归。您需要两个终止案例,而不是一个。
以fib(1)
为例。这会调用fib(0)
和fib(-1)
。 fib(0)
将终止,但fib(-1)
将无限地调用fib(1), which will then again call
fib(-1)`。
解决方案:如果n==0
或n==1
旁注:fib(0)
通常定义为0,而不是1。
答案 2 :(得分:1)
糟糕,我犯了一个愚蠢的错误,忘记了n == -1基本情况。它应该是:
int fib(int n) {
if( n == -1){
return 1;
}else if ( n < 0 ){
return ( pow(-1,-n+1 ) * fib(-n) );
}else if (n == 0){
return 1;
}else{
return fib(n-1) + fib(n-2);
}
}
现在一切都按预期工作了。
答案 3 :(得分:1)
According to your extension, shouldn't this be:
int fib(int n) {
if ( n < 0 ){
return ( pow(-1,n+1 ) * fib(n) ); // <<<
}else if (n == 0){
return 1;
}else{
return fib(n-1) + fib(n-2);
}
}