我在使用递归函数时遇到问题。 我现在曾经发生过几次这样的事情,但我只是做了尴尬的解决方法。
#include <iostream>
using namespace std;
int fib(int n);
int main() {
int i = 5;
i = fib(i);
cout << i << endl;
system("pause");
}
int fib(int n) {
cout << n << endl;
if (n <= 0)
return 0;
else if (n == 1)
return 1;
else
return fib(n - 1) + fib(n - 2);
}
我遇到的问题是输出远远不是它应该是的,通过遵循我可以看到的断点,一旦函数完成它应该,else语句下的最后一行仍然是调用。 我确定这是一件很简单的事我做错了但如果有人能够对此有所了解,我将感激不尽!
答案 0 :(得分:1)
该函数是正确的,即使您应该F(1)
fib(0)
或fib(1)
,因为在您的实现fib(0) == 0
中,但该系列的第一个元素是1 ,而不是0。
除此之外,我没有看到任何问题,您遇到的问题存在,例如,在LLDB中,放置在函数中间的return
语句使调试器“通过”函数的最后一条指令(但这只是由代码和底层二进制文件之间的映射引起的),它并没有真正执行该语句。
答案 1 :(得分:0)
关于你对这种痕迹的困惑,我想我可以解释一下。
在fib(5)
中,您以递归方式调用fib(4)
。完成所有递归后,解决了,你回到了fib(5)
...然后递归调用fib(3)
,这样你就可以做更多的计算......然后一旦完成,你回到了fib(5)
,在完成之前还有其他的事要做,可以回来。
(免责声明:上述订单无法保证;例如,编译器可能会先决定让您的程序先计算fib(3)
然后再计算fib(4)
)
在fib(5)
的计算中,最终返回行在不同的调用中执行七次。对于大型n
,您需要进行大量的递归调用;这个例子是动态编程和/或记忆化的好处的常见示例之一。 (或者甚至只是仔细地重构递归,这样你就没有递归调用树;例如,有一个递归实现的函数返回一对由n
- th 和组成的对{ {1}} - 斐波那契数字)
答案 2 :(得分:0)
希望这会有所帮助..
#include <iostream>
using namespace std;
int Fibo(int);
int main(void) {
int number;
cout << "Please enter a positive integer: ";
cin >> number;
if (number < 0)
cout << "That is not a positive integer.\n";
else
cout << " Fibonacci is: " << Fibo(number) << endl;
}
int Fibo(int x)
{
if (x < 2){
return x;
}
return (Fibo (x - 1) + Fibo (x - 2));
}
答案 3 :(得分:-1)
我没有测试过它,但它可能是一个“悬而未决的问题”。对条件块不使用花括号是一种糟糕的编码风格。帮自己一个忙,写一下吧。像
if( n <= 0 )
{
return( 0 );
}
else if( n == 1 )
{
return( 1 );
}
else
{
return( fib( n - 1 ) + fib( n - 2 ) );
}
我怀疑你的代码被解释为
if( n <= 0 )
{
return( 0 );
}
else
{
if( n == 1 )
{
return( 1 );
}
else
{
return( fib( n - 1 ) + fib( n - 2 ) );
}
}
没有花括号,你的代码是暧昧的。我不知道编译器对您的代码片段的哪种解释是有利的。您可以通过引入大括号轻松检查这是否是问题。