递归给人的感觉总是很高大上,个人感觉再多的理论知识都不如一个完美的例子,不喜勿喷。
网上看到一个题目:有一堆桃子,猴子每天吃一半后再多吃一个,到第5天时剩余一个桃子,求第一天的个数。
前一天 = ( 后一天 + 1 ) * 2;
例如:第4天 = ( 第5天 + 1 ) * 2 = ( 1 + 1) * 2 = 4;
代码如下:
/************************************************************* 有一堆桃子,猴子每天吃一半后再多吃一个,到第5天时剩余一个桃子 *************************************************************/ #include <stdio.h> int recursion(int day) { int total; if (day == 5) { return 1; } else if (day < 5) { day++; total = (recursion(day) + 1) * 2; return total; } } int main(void) { int i; for (i=1;i<=5;i++) printf("第%d天有%d个桃子 ", i, recursion(i)); return 0; }
运行结果:
第1天有46个桃子
第2天有22个桃子
第3天有10个桃子
第4天有4个桃子
第5天有1个桃子
请按任意键继续. . .
下面开始逐步讲解高大上的递归:
recursion(1)
进入int recursion(int day)函数
day = 1; day < 5; day++; day = 2; total = ( recursion(2) + 1 ) * 2; //第1天桃子个数未知 day = 2; day < 5; day++; day = 3; total = ( recursion(3) + 1 ) * 2; //第2天桃子个数未知 day = 3; day < 5; day++; day = 4; total = ( recursion(4) + 1 ) * 2; //第3天桃子个数未知 day = 4; day < 5; day++; day = 5; total = ( recursion(5) + 1 ) * 2; //第4天桃子个数未知 day = 5; day == 5; return 1; //第5天桃子个数为1(已知) recursion(5) = 1; total = ( recursion(5) + 1 ) * 2 = 4; return total ; //第4天桃子个数为4 recursion(4) = 4; total = ( recursion(4) + 1 ) * 2 = 10; return total ; //第3天桃子个数为10 recursion(3) = 10; total = ( recursion(3) + 1 ) * 2 = 22; return total ; //第2天桃子个数为22 recursion(2) = 22; total = ( recursion(2) + 1 ) * 2 = 46; return total ; //第1天桃子个数为46