递归通过调用函数本身,可将大型程序转化为小型程序,减小代码量
1.累加
#includeint addTo(int paraN) { int tempSum; printf("entering addTo(%d)rn", paraN); if (paraN <= 0) { printf(" return 0rn"); return 0; } else { tempSum = addTo(paraN - 1) + paraN; printf(" return %drn", tempSum); return tempSum; } } void addToTest() { int n, sum; printf("---- addToTest begins. ----rn"); n = 5; sum = addTo(n); printf("rn0 adds to %d gets %d.rn", n, sum); n = 1; sum = addTo(n); printf("rn0 adds to %d gets %d.rn", n, sum); n = -1; sum = addTo(n); printf("rn0 adds to %d gets %d.rn", n, sum); printf("---- addToTest ends. ----rn"); }// Of addToTest int main() { addToTest(); }// Of main
以其累加为例,转化为下个函数的累加,并以此往复
运行结果
---- addToTest begins. ---- entering addTo(5) entering addTo(4) entering addTo(3) entering addTo(2) entering addTo(1) entering addTo(0) return 0 return 1 return 3 return 6 return 10 return 15 0 adds to 5 gets 15. entering addTo(1) entering addTo(0) return 0 return 1 0 adds to 1 gets 1. entering addTo(-1) return 0 0 adds to -1 gets 0. ---- addToTest ends. ----
二.汉诺塔问题
相传在古印度圣庙中,有一种被称为汉诺塔的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
思考的时候我们可以首先思考只有两个盘的情况,我们只需要进行操作A->B,A->C,B->C即可实现,
同理在移动时我们可将其转化,不要考虑多层
#includevoid hanoi(int paraN, char paraSource, char paraDestination, char paraTransit) { if (paraN <= 0) { return; } else { hanoi(paraN - 1, paraSource, paraTransit, paraDestination); printf("%c -> %c rn", paraSource, paraDestination); hanoi(paraN - 1, paraTransit, paraDestination, paraSource); } } void hanoiTest() { printf("---- addToTest begins. ----rn"); printf("2 platesrn"); hanoi(2, 'A', 'C', 'B'); printf("3 platesrn"); hanoi(3, 'A', 'C', 'B'); printf("---- addToTest ends. ----rn"); } int main() { hanoiTest(); return 0; }
运行结果
2 plates A -> B A -> C B -> C 3 plates A -> C A -> B C -> B A -> C B -> A B -> C A -> C



