Hanoi塔问题(递归解决)

首先了解一下递归的思想:

        设计一个递归函数,一般需要首先分析以下问题。

* 退出递归的边界条件及其边界值。即分析在什么情况下,才可以直接求出问题的解,从而退出递归。

* 执行递归的通式。把一个大规模问题分解为小规模问题之后。需要哪些方法保证两者的性质相同。

    然后在设计递归函数时,使用选择语句判断边界条件是否成立,如成立,则直接返回函数;否则使用通式递归调用。

#include 

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’都是相对的。

 

 

 

 

你可能感兴趣的:(算法)