首先了解一下递归的思想:
设计一个递归函数,一般需要首先分析以下问题。
* 退出递归的边界条件及其边界值。即分析在什么情况下,才可以直接求出问题的解,从而退出递归。
* 执行递归的通式。把一个大规模问题分解为小规模问题之后。需要哪些方法保证两者的性质相同。
然后在设计递归函数时,使用选择语句判断边界条件是否成立,如成立,则直接返回函数;否则使用通式递归调用。
#include <stdio.h>
void move(int n,char a,char b,char c) //此函数实现将a上的n个圆环转移到c上
{
if(n==1)
printf("%c-->%c\n",a,c); //当时1时,直接将此圆盘移动到C盘
else{
move(n-1,a,c,b);
printf("%c-->%c\n",a,c);;
move(n-1,b,a,c);
}
}
int main()
{
int n;
scanf("%d",&n);
move(n,'a','b','c');//将a上的n个圆环转移到c上
}
Hanoi塔算法分析:
设A上有n个盘子,如果n=1则直接将这一个圆盘从A移动到C即可(这也是辨认此递归的临界条件);如n!=0,则分为三步,把n-1个盘子从A移动到B,把A上最后一个圆盘移动到C,此时只需要把B上的n-1个圆盘移动到C(这便形成递归)。在递归调用过程中n=n-1,故n的值逐渐递减,最后n=1,达到临界条件,终止递归,逐级返回,便实现最终结果。
~~对move函数的特别说明:move(...)是干什么的,所有的move(***)便是干什么的,先不用想它具体实现过程,只需找到临界时的处理方式即可。此题move便是实现
将a上的n个圆环转移到c上 ,‘a'‘c’‘n’都是相对的。