C++中一段看不懂的递归调用函数

来源:百度知道 编辑:UC知道 时间:2024/06/05 21:30:48
int fib(int n)
{
cout<<"Processing fib("<<n<<")...";
if(n<3)
{
cout<<"Return 1!\n";
return(1);
}
else
{
cout<<"Call fib("<<n-2<<")and fib("<<n-1<<").\n";
return(fib(n-2)+fib(n-1));
}

这段函数的作用就是打印出来一串斐波那契数列(就是第3项的值等于前两项之和,我不知道你是函数算法看不懂还是对C++不熟悉。我给你注释一下)
// fib数列:1,1,2,3,5,8,13...(注意,前两项是1,这是数学里的规定)
int fib(int n)
{
cout<<"Processing fib("<<n<<")...";//cout就是输出到屏幕的流对象,要是不知道就看看c++
if(n<3)
{
cout<<"Return 1!\n";
return(1); //到这里整个函数调用结束。
}
else
{
cout<<"Call fib("<<n-2<<")and fib("<<n-1<<").\n";
return(fib(n-2)+fib(n-1)); //如果当前递归调用到第5个数,那就调用fib(4),fib(3),而fib(3)=fib(1)+fib(2)=2,同样得到fib(4)=fib(3)+fib(2)=3,最后得到fib(5)=fib(4)+fib(3)=5.
}
} //注,这里你的函数少写了结束括号,这整个算法是一个函数体fib。
因此这个函数的虽然数出比较多,没有什么那么多必要,但是核心的输出应该是:(其实就是把递归的过程打印出来,跟最后结果没太大关系)
Return 1!
Return 1!
Processing fib(3)。。。。
Processing fib(4)。。。。
但是函数的整体返回值确是最后的第n个fib数列的值,比如上面举得例子:
fib(5)返回值就是5,这个数字才是我们真正需要的。另外告诉你,不要觉得递归很帅,其实递归算法在实践中效率很低,因为跳转太多(就是拿来考级用),要是有本事用顺序流实现一个复杂算法才是高手。