⑴ 汉诺塔递归算法
1个只要1次2个碟子要3次3个要7次归纳法可以推得复杂度为2^n-1这个可以证明的,只是证明很复杂。
⑵ 汉诺塔 递归算法的详细解释请教高手
为了实现 n个盘从 借助c 从a 移动到 b
思路如下:
首先考虑极限当只有一个盘的时候 只要 盘直接从 a -> b即可
那么当有2个盘的时候就只要先把1号盘从a -> c 然后 把2号盘 a->b 再 把 2好盘从 c - > b
那么当有n个盘的时候你只要先把 n-1个 盘 借助 b 移动到 c 然后将 n号盘从 a -> b
那么这时候只要将 n-1想办法从c移动到 b 借助 a 那么就可以先把 n-2个盘借助b移动到a
然后 把n-1号盘从c-> b如此递归就是了!
#include <stdio.h>
void mov(int n,char a,char b)
{
printf("盘%d : 从 %c ---> %c\n",n,a,b);
}
void Hanoi(int n,char a,char b,char c)
{
if(n == 0) return ;
Hanoi(n-1,a,c,b);
mov(n,a,b);
Hanoi(n-1,c,b,a);
}
int main()
{
Hanoi(2,'a','b','c');
return 0;
}
⑶ 汉诺塔递归算法是什么
hanot (n-1,b,a,c);(解释:在把B塔上的(n-1))个借助A塔移动到C塔)
为了实现 n个盘从 借助c 从a 移动到 b
思路如下:
首先考虑极限当只有一个盘的时候,盘直接从 a -> b即可。
当有2个盘的时候,把1号盘从a -> c 然后 把2号盘 a->b 再 把 2好盘从 c - > b。
当有n个盘的时候,把 n-1个 盘 借助 b 移动到 c 然后将 n号盘从 a -> b。
这时候只要将 n-1想办法从c移动到 b 借助 a 那么就可以先把 n-2个盘借助b移动到a。
递归,就是在运行的过程中调用自己。
构成递归需具备的条件:
1,子问题须与原始问题为同样的事,且更为简单;
2,不能无限制地调用本身,须有个出口,化简为非递归状况处理。
在数学和计算机科学中,递归指由一种(或多种)简单的基本情况定义的一类对象或方法,并规定其他所有情况都能被还原为其基本情况。
以上内容参考:网络-递归公式
⑷ 汉诺塔问题(编程)
可是非递归就有一点纠结了哈
⑸ 汉诺塔问题算法详细解答
#include <stdio.h>
void hanio(int n,char a,char b,char c)
{
if(n>=1)
{hanio(n-1,a,c,b);//可以理解为把a上的n-1个盘子通过c移动到b上
printf("%c--> %c\n",a,c);//然后再把a上剩下的一个盘子移动到c上
hanio(n-1,b,a,c);//再把b上的n-1个盘子通过a移动到c上,搞定,递归程序,看起来简单,理解起来稍微有点难度,调试也不容易,你用多了就明白了
}
}
int main ()
{
int n ;
printf("please input the num:\n");
scanf("%d",&n) ;
//盘子数为n,三个柱子分别为ABC
hanio ( n, 'A' , 'B' , 'C' ) ;
return 0;
}
⑹ 汉诺塔算法
#include <stdio.h>
int main()
{
void hanoi(int n,char one,char two,char three); // 对hanoi函数的声明
int m;
printf("input the number of diskes:");
scanf("%d",&m);
printf("The step to move %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char two,char three) // 定义hanoi函数
// 将n个盘从one座借助two座,移到three座
{
void move(char x,char y); // 对move函数的声明
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y) // 定义move函数
{
printf("%c-->%c\n",x,y);
}
⑺ 汉诺塔算法问题
if(n==1)
printf("%c-->%c\n",x,z);
else
{ move(n-1,x,z,y);
printf("%c-->%c\n",x,);
move(n-1,y,x,z);
当调用move(1,y,x,z)
就执行if(n==1)
printf("%c-->%c\n",x,z);
接着就回溯到上一层
其实如果你调试一下,一步一步的执行,你就明白了
⑻ 汉诺塔算法步骤解析
这是一个递归的过程,你要自己搞个简单例子摆一摆,再看看我的解释就明白了
hanoi(n-1, A, C, B);//将n-1个盘通过c从a移到b
printf("Move sheet %d from %c to %c\n", n, A, C);//将第n个盘从a移到c
hanoi(n-1, B, A, C);//将n-1个盘通过a从b移到c
⑼ 汉诺塔问题算法
纯手打,自己理解的。看的东就给分吧...
例如n=3
3,A,B,C
{ 2,A,C,B---------------->{1,A,B,C ============>A->C
move(A,B) ============>A->B
1,C,A,B ============>C->B
}
move(A,C) ============>A->C
2,B,A,C------------------>{1,B,C,A ============>B->A
move(B,C) ============>B->C
1,A,B,C ============>A->C
}
}
⑽ 关于汉诺塔的算法问题
我也是学到这有点难 递归是有点难感觉 指针也是 这个题到现在我也是半理解的 递归主要还要看有一个第几层的关系 程序先递归到最底层 再从最底层得到结果在一层层的上来 期间的过程就输出了结果