漢諾塔問題(遞歸思想)

問題描述: 有三根杆子A,B,C。A杆上有N個(N>1)穿孔圓盤,盤的尺寸由下到上依次變小。要求按下列規則將所有圓盤移至C杆: 每次只能移動一個圓盤; 大盤不能疊在小盤上面。 提示:可將圓盤臨時置於B杆,也可將從A杆移出的圓盤重新移回A杆,但都必須遵循上述兩條規則。問:如何移?最少要移動多少次?

在這裏插入圖片描述

解決思路:

將A中的盤按要求移到C盤,分解爲,將C中的n-1個移到B盤,再將A的最後一個盤移到C盤,最後將B中的n-1個盤按要求借助A盤移動到C盤。
上源碼:

#include<stdio.h>
#define N 3
int count=1;
void move(char ch1,char ch2)
{
	printf("第%d次移動:%c  --->  %c\n",count++,ch1,ch2);
}
void han_ta(int n ,char A,char B, char C)//n爲圓盤的個數
{
	if(n==1)//遞歸出口
	{
		move(A,C);//將A盤移動到C盤
	}
	else
	{
		han_ta(n-1,A,C,B);//將A上方的n-1個盤通過C移動到B
		move(A,C);//將A中的最後一個原盤放到C
		han_ta(n-1,B,A,C);//將B中的n-1個圓盤通過A移動到C
	}
}
int main()
{
	han_ta(N,'A','B','C');
	return 0;
}

核心代碼:

void han_ta(int n ,char A,char B, char C)//n爲圓盤的個數
{
	if(n==1)//遞歸出口
	{
		move(A,C);//將A盤移動到C盤
	}
	else
	{
		han_ta(n-1,A,C,B);//將A上方的n-1個盤通過C移動到B
		move(A,C);//將A中的最後一個原盤放到C
		han_ta(n-1,B,A,C);//將B中的n-1個圓盤通過A移動到C
	}
}

思考:遞歸是內部是怎麼實現的?這是我們要思考的問題,我們知道遞歸算法,我們可以通過棧替換,遞歸的過程就是一個出入棧的過程。我敢肯定遇到遞歸算法,你肯定會根據代碼,代數進去驗證結果,結果一頭霧水,越想越懵。這邊建議去思考遞歸內部實現

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章