根據漢諾塔的遞歸定義
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規模的遞歸
設盤子數爲時的移動次數爲 ,易得遞推公式
由數列推導
附漢諾塔的遞歸程序:
#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;
}