函数递归
递归其实是⼀种解决问题的⽅法,递归就是函数⾃⼰调⽤⾃⼰。
思想:
把⼀个⼤型复杂问题层层转化为⼀个与原问题相似,但规模较⼩的⼦问题来求解;直到⼦问题不能再被拆分,递归就结束了。所以递归的思考⽅式就是把⼤事化⼩,小事化了的过程。
递归递归,递就是递推的意思,归就是回归的意思。
2个必要的条件:
递归的限制条件,每次递归调⽤之后越来越接近这个限制条件。
到达限制条件后又返回
汉诺塔问题
相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如图)。
游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。
操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。
输入格式:
输入在一行中给出1个正整数n。
输出格式:
输出搬动盘子过程。
输入样例:
在这里给出一组输入。例如:
3
输出样例:
在这里给出相应的输出。例如:
No.1 disk: a->c
No.2 disk: a->b
No.1 disk: c->b
No.3 disk: a->c
No.1 disk: b->a
No.2 disk: b->c
No.1 disk: a->c
一开始看到这个题目,无从下手。就先画图呗,画图还是会的。看能从一个个图中找到什么规律(思路往着递归方向)。
——————————————————————————————————————
——————————————————————————————————————
————————————————————————————————————————————
————————————————————————————————————————————
可以发现:
由此推出共有n块时的移动方法
#include<stdio.h>
void hanoi(int n, char a, char b, char c)
{
if (n == 1)//递归条件,不断递进
{
printf("No.%d disk: %c->%c\n", n, a, c);//只有一块A->C
}
else
{
hanoi(n - 1, a, c, b);//n-1块从A柱借助C柱子到B柱子
printf("No.%d disk: %c->%c\n", n, a, c);//A柱子上只有一块了,A->C
hanoi(n - 1, b, a, c);//再把n-1块从B柱借助A柱子到C柱子
}
}
int main()
{
int n = 0;
scanf("%d", &n);
hanoi(n, 'a', 'b', 'c');
return 0;
}
感觉这个代码就像分析的一个总体的大概的过程,并不会深入到每一个细节,每一个细节在程序执行递归时就已经发生了。