fib (n) = 1 (n=1)
fib (n) = n*fib(n-1) (n>1)
// 条件不成立,则继续调用函数并检查条件不满足则继续调用函数...直到函数返回值为1时,再一层层将返回值递归返回上来
// 我们可以用符合条件的尽量简单的实例来剖析那些复杂的算法
例如:5 * 4 * 3 * 2 * 1 = ?
算了,上面的测试数字太大太复杂了,再选个简单点的例如:3 * 2 * 1 = ?
有人说 2 * 1 = ? 更简单不过了,我们是要体现递归的特性,所以选择3 * 2 * 1 = ? 再合适不过了,废话不多,进入正题:
该递归算法源代码为:
uint32_t fib (uint32_t n)
{
if (1==n)
return 1;
else
return (n * fib (n-1));
}
测试源码为(由于语句嵌入层次比较深,所以我们选择最小的例子来分析,请紧随下列语句分析下去,您一定会豁然开朗!):
fib (3)
{
if (1 == 3)
return 1;
else
return (3 * fib(3-1));
}
源码展开为:
初次阅读注释请看注释1,根据后面的注释提示再看注释2:
fib (3) /* 注释2: 最终得出 fib(3) = 6,这就是递归算法思想,它像剥洋葱表皮一样一层层深入运算一直到最嫩最好吃的一层,再将返回值一层层返回上来 */
{
if (1 == 3)
return 1;
else
return (3 * fib(3-1)); // 注释1:此处n == 传入参数3
此语句处展开:
3 * fib (2) // 注释2:根据fib(2) = 2, 得出 fib(3) == return (3 * fib(2)) == return (3 * 2) == return 6; 所以fib(3) = 6;
{
if (1==2)
return 1;
else
return (2 * fib(2-1)); // 注释2:所以此处返回值为:return (2 * fib (1)) == return (2 * 1) == return (2);由此得出fib (2) = 2
此语句处展开:
2 * fib (1) // 注释2:2 * fib (1) = 2 * 1 = 2,然后往上看到return (2 * fib (2-1));处的注释2
{
if (1==1) return 1; // 传入参数n为1,条件成立!fib (1) 将返回 1,所以请注意上面 2 * fib (1) 处的“注释2”
else return (1 * fib (1)); // 显然不会执行到此处
}
}
}