BUPT-DSA 2019 Fall Chap.3 推導n階漢諾塔(梵塔)執行move步驟的次數

根據漢諾塔的遞歸定義

void hanoi(int n,...)
    if(n==1)
        move(1,...);
	else
    {
        hanoi(n-1,...);
        move(n,...);
        hanoi(n-1,...);
    }

由此可見,函數在n=1時執行一次move函數後退出,在非1時,執行一次move並執行兩次n-1規模的遞歸

設盤子數爲nn時的移動次數爲T(n)T(n) ,易得遞推公式

T(n)={2T(n1)+1n21n=1T(n)=\begin{cases} 2T(n-1)+1 & n\geq 2\\1 & n= 1 \end{cases}

由數列推導

n2T(n)+1=2(T(n1)+1)=2n1(T(1)+1)=2n12=2nT(n)=2n1n=1n\geq2時,T(n)+1=2(T(n-1)+1)=2^{n-1}(T(1)+1)=2^{n-1}*2=2^n\\故T(n)=2^n-1,當n=1時,同樣成立

附漢諾塔的遞歸程序:

#include <stdio.h>
int cnt=0;
void hanoi(int n,char src,char mid,char dst)
{
	if(n==1)
		{
			printf("Moved Plate[1] from %c to %c.\n",src,dst );
			++cnt;
		}
	else
	{
		hanoi(n-1,src,dst,mid);
		printf("Moved Plate[%d] from %c to %c.\n",n,src,dst );
		++cnt;
		hanoi(n-1,mid,src,dst);
	}
}

int main(int argc, char const *argv[])
{
	int n;
	scanf("%d",&n);
	hanoi(n,'A','B','C');
	printf("Moved %d times.\n",cnt );
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章