這是壹個經典的遞歸。
分析:這是壹個非常好的遞歸編程的例子。與之前的遞歸程序不同,他先有壹個非遞歸程序,然後重寫為遞歸形式。如果這個問題不使用遞歸過程,可能無法啟動。讓我們以三塊金子為例:
要從條形a移動到條形b,您必須在條形c的幫助下進行轉換。移動方案為:
A-B
步驟2 A-C
第三步B-C
A-B
第五步C-A
步驟6 C-B
A-B
* * *移動七次完成A極上的三枚金塊,按照題目要求的規則移動到B極。
題目要求以同樣的方式將N枚金幣從A桿移動到B桿:
1.首先(遞歸地)將A杠上面的n-1塊移動到C杠上(使用B杠);
2.然後把A杠上唯壹的壹塊移到B杠上;
3.然後將C條上的n-1塊(遞歸)移動到B條上(使用A條)。
這是壹個遞歸調用過程。該過程如下:
程序P6-14;
定義變量
n:整數;
過程移動(n:整數;a,b,c:char);{定義遞歸過程}
開始
如果n=1,則
writeln('move ',n,' from ',a,' to ',b)
Else {多個切片,遞歸}
開始
move(n-1,a,c,b);{遞歸地將n-1塊從A移動到C,並使用桿B進行轉換}
writeln('move ',n,' from ',a,' to ',b);{最後壹部電影從A移到b}
移動(n-1,c,a,b);{遞歸地將桿C上的n-1移動到桿B上,並使用桿A進行過渡}
結束;
結束;
開始{主程序}
write('輸入n:');
讀作(n);
move(n,' A ',' B ',' C ');
結束。
運行:
輸入n: 3(回車)
將1從A移動到B
將2從A移動到C
將1從B移動到C
將3從A移動到B
將1從C移動到A
將2從C移動到B
將1從A移動到B
程序運行時,輸入n的值,除了3,可以選擇4,5,6,但千萬不要輸入64。因為通過推演,如果按照規則移動64枚金幣,妳要移動2 64-1 = 1.8 * 10 19次。如果每秒移動壹次,就需要壹萬億年。根據科學計算,地球的“壽命”大約是幾十億到幾百億年。妳可以看到地球的毀滅,妳也無法完成遊戲。即使計算機每秒鐘“移動”壹億次,也需要5800年,所以不可能完成遊戲。
這樣夠詳細了吧?摘自《Pascal語言中學版第2版,青少年信息學奧林匹克競賽訓練教材》北京理工大學出版社,這個還不錯。