汉诺塔程序
# include "stdio.h" void move(char x, char y) //自定义move函数,用来将块从起始柱子x移动到目标柱子y,这里的x,y为形参,不代表具体哪根柱子 { printf("\t%c-->%c\n",x,y); } void hannuota(int n, char a, char b, char c) //自定义hannuota函数,这里的a,b,c为形参,不代表具体哪根柱子 { if (n == 1) move(a, c); //调用自定义函数move else { hannuota(n-1, a, c, b); //第一行递归 move(a, c); //调用自定义函数move hannuota(n-1, b, a, c); //第二行递归 } } int main(void) { int n; printf("请输入要移动的块数:\n"); scanf("%d", &n); hannuota(n, 'a', 'b', 'c'); return 0; } /*执行详细步骤:当n = 3 时 n = 3 n = 2 n = 1 | |h(1, a, b, c)=>move(a, c)=> a->c //1 |h(2, a, c, b) |move(a, b) a->b //2 | |h(1, c, a, b)=>move(c, b)=> c->b //3 | h(3, a, b, c) |move(a, c) a->c //4 | | |h(1, b, c, a)=>move(b, a)=> b->a //5 |h(2, b, a, c) |move(b, c) b->c //6 | |h(1, a, b, c)=>move(a, c)=> a->c //7 | 执行结果: 请输入要移动的块数: 3 a-->c a-->b c-->b a-->c b-->a b-->c a-->c */
关于一个函数的递归调用,使用V模型,逐项深入,逐项返回,用“栈”的思路去理解;
http://www.cnblogs.com/zhangqqqf/archive/2008/09/12/1289730.html
两个函数的自身递归,使用"满二叉树"的模型,语句块可以逐步分解。。
关于递归树http://hi.baidu.com/sei_zhouyu/item/e5ce9110fcdb86f09c778ab3