递归的思想在解小规模问题时可以写出优雅易懂的解法。
怎么进行递归的设计,以前看到过一本书上讲,递归的精粹是相信它能做到你让他做的事。
#include<stdio.h>
int move(int n, char left, char mid, char right);
int main()
{
int n;
scanf("%d", &n);
move(n, 'a', 'b', 'c');
return 0;
}
int move(int n, char left, char mid, char right)
{
if(n == 1)
{
printf("%c->%c\n", left, right);
return 0;
}
move(n-1, left, right, mid);
move(1, left, mid, right);
move(n-1, mid, left, right);
return 0;
}
这个函数move就是用来的递归的,它能做到的是把n层碟子从参数left通过mid移到right,并打印出移动的过程。
首先,给它一个处理的最简单事件,移动一层,也就是很简单的从left->right
if(n == 1)
{
printf("%c->%c\n", left, right);
return 0;
}
然后,三个move,模拟的是最顶层n-1层和剩下1层碟片移动
第一个move指的是把上面n-1层移动到中间,
第二个move指的是把最下面一层移动到右面
最后,把在中间的n-1层移动到右面。
这是模仿的两层碟片的移动,不同的是把n-1层看成了一个整体,相信move n-1层时能正确做到,逻辑上就完成了整个过程。