c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)
問題概述:古代有一個梵塔,塔內有3個座A,B,C。開始時A座上有64個盤子,盤子大小不等,大的在下,小的在上,有一個老和尚想把64個盤子從A座移動到C座,但是規定每次只允許移動一個盤,且在移動過程中在3個座上都始終保持大盤在下,小盤在上。在移動的過程中可以利用B座。(寫出移動的步驟)。
問題分析:在這個問題中,我們先來看如果盤子總量n=3時的情況,因為最終要將盤子移動到C中,所以最終情況一定是最大的第3個盤子在C上,然后再將前兩個在B上的盤子移動到C上,如何將前兩個盤子移動到B上呢?就是要將此時最大的第二個盤子移動到B上,然后將第一個盤子從A移動到B上,實現了兩層函數的遞歸。總結:問題分為三步:1,將最大的盤子前面的n-1個移動到B上,將最大的盤子移動到C上,然后將B上的n-1個移動到C上。這三步中的第一步操作步驟為:將n-2個盤子移動到C上,將最大的盤子移動到B上,然后將第n-2個盤子移動到B上,第三步的操作步驟為:將n-2個盤子移動到A上,將第n-2個盤子移動到C上,再將前面n-2個盤子移動到C上。這三步中第一步操作步驟為:將n-3個盤子移動到B上,將最大的盤子移動到C上,然后將第n-3個盤子移動到C上,以此類推。在步驟中涉及參數的改變和函數的遞歸問題。以4個盤子為例做出流程圖如下:
問題代碼:
#include
void Hanoi( int n, char a, char b, char c);//漢諾塔函數聲明
void Move( int n, char a, char b);//輸出操作步驟函數的函數聲明
int count;
int main()
{
int n=8;
printf ( "漢諾塔的層數:\n" );
scanf ( " %d" ,&n);
Hanoi(n, 'A' , 'B' , 'C' );
return 0;
}
void Hanoi( int n, char a, char b, char c)
{
if (n == 1)
{
Move(a, c);
}
else
{
Hanoi(n - 1, a, c, b);//因為最終要將所有盤子移動到C上,所以將B,C進行形式互換//
Move(n, a, c);
Hanoi(n - 1, b, a, c);//和第一步同理//
}
}
void Move( char a, char b)
{
count++;
printf ( "第%d次移動 Move: Move from %c to %c !\n" ,count,a,b);
}
總結
以上是生活随笔為你收集整理的c语言函数汉诺塔不用move,C语言——汉诺塔问题(函数递归)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 成绩管理单链表文件c语言,c语言学生信息
- 下一篇: c 语言 可变参数前要加形参,C/C++