C语言汉诺塔问题,不是很理解
//汉诺塔2#include<stdio.h>3voidhanoi(intn,chara,charb,charc)//这里代表将a柱子上的盘子借助b柱子移动到c柱子4{i...
// 汉诺塔
2 # include <stdio.h>
3 void hanoi ( int n, char a, char b, char c ) //这里代表将a柱子上的盘子借助b柱子移动到c柱子
4 { if (1 == n) //如果是一个盘子直接将a柱子上的盘子移动到c
5 {
6 printf("%c-->%c\n",a,c);
7 }
8 else
9 {
10 hanoi ( n-1, a, c, b ) ; //将a柱子上n-1个盘子借助c柱子,移动到b柱子
11 printf("%c-->%c\n",a , c) ; //再直接将a柱子上的最后一个盘子移动到c
12 hanoi ( n-1, b, a, c ) ; //然后将b柱子上的n-1个盘子借助a移动到c
13 }
14 }
15 int main ()
16 { int n ;
17 printf( "Input the number of diskes:") ;
18 scanf("%d",&n) ;
19 hanoi ( n, 'A' , 'B' , 'C' ) ;
20 return 0;
21 }
---------------------------------------------------------------------------------
我有俩问题。。这个我很不理解的是第十一行的注释再直接将a柱子上的最后一个盘子移动到c,它明明有时候是把B移到A或者移到C啊
再有就是如果我自己设计这个程序思路好难啊,根本想不到这个答案,好像跟第一个问题有关系,蟹蟹解答! 展开
2 # include <stdio.h>
3 void hanoi ( int n, char a, char b, char c ) //这里代表将a柱子上的盘子借助b柱子移动到c柱子
4 { if (1 == n) //如果是一个盘子直接将a柱子上的盘子移动到c
5 {
6 printf("%c-->%c\n",a,c);
7 }
8 else
9 {
10 hanoi ( n-1, a, c, b ) ; //将a柱子上n-1个盘子借助c柱子,移动到b柱子
11 printf("%c-->%c\n",a , c) ; //再直接将a柱子上的最后一个盘子移动到c
12 hanoi ( n-1, b, a, c ) ; //然后将b柱子上的n-1个盘子借助a移动到c
13 }
14 }
15 int main ()
16 { int n ;
17 printf( "Input the number of diskes:") ;
18 scanf("%d",&n) ;
19 hanoi ( n, 'A' , 'B' , 'C' ) ;
20 return 0;
21 }
---------------------------------------------------------------------------------
我有俩问题。。这个我很不理解的是第十一行的注释再直接将a柱子上的最后一个盘子移动到c,它明明有时候是把B移到A或者移到C啊
再有就是如果我自己设计这个程序思路好难啊,根本想不到这个答案,好像跟第一个问题有关系,蟹蟹解答! 展开
2个回答
展开全部
请注意,void hanoi ( int n, char a, char b, char c )
这里的a,b,c是三个char变量。
当执行调用hanoi(3,'B','C','A');时,“将a柱子上的最后一个盘子移动到c”,
其中的a的值就是'B',c的值就是'A',也就是“将B柱子上的最后一个盘子移动到A柱”了。
这里的a,b,c是三个char变量。
当执行调用hanoi(3,'B','C','A');时,“将a柱子上的最后一个盘子移动到c”,
其中的a的值就是'B',c的值就是'A',也就是“将B柱子上的最后一个盘子移动到A柱”了。
更多追问追答
追问
嗯嗯,那想设计这个程序的思路可以讲一下吗?
追答
已经在注释中详细说明了。主要是递归的思路。
递归算法是一种直接或者间接地调用自身算法的过程。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
递归算法解决问题的特点:
(1) 递归就是在过程或函数里调用自身。
(2) 在使用递归策略时,必须有一个明确的递归结束条件,称为递归出口。
(3) 递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。
(4) 在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。所以一般不提倡用递归算法设计程序。
要求
递归算法所体现的“重复”一般有三个要求:
一是每次调用在规模上都有所缩小(通常是减半);
二是相邻两次重复之间有紧密的联系,前一次要为后一次做准备(通常前一次的输出就作为后一次的输入);
三是在问题的规模极小时必须用直接给出解答而不再进行递归调用,因而每次递归调用都是有条件的(以规模未达到直接解答的大小为条件),无条件递归调用将会成为死循环而不能正常结束。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询