在 TOH(河內塔)中列印從源到目的地的移動磁盤可以很容易地用 C/C 撰寫。(帶有遞回函式)但是我們如何列印每一步的索引呢?C代碼-
#include<stdio.h>
void tower( int disk, int peg1, int peg2, int peg3);// function declaration
int main()
{
int disk;
int peg1= 1, peg2= 2, peg3= 3;//numbering
puts("enter disk");
scanf("%d", &disk);//read disks
tower(disk, peg1, peg2, peg3);//function using
return 0;
}
void tower( int disk, int peg1, int peg2, int peg3)//function definition
{
if(disk ==1)//if only 1 disk is avialable
{
printf("move disk from peg%d to peg%d\n",peg1,peg3);//moving disk from source to destination
}
else
{
tower(disk-1, peg1,peg3,peg2);//moving n-1 disk from peg 1 to peg2 using peg3
printf("move disk from peg%d to peg%d\n", peg1,peg3);//move last biggest disk
tower(disk-1,peg2,peg1,peg3);//moving n-1 disk from peg2 to peg3 using peg1
}
它可以作業并列印輸出。
但是有什么方法可以索引(1,2,...)每個步驟,例如-
- 將磁盤從 peg1 移動到 peg3
- 將磁盤從 peg1 移動到 peg2
uj5u.com熱心網友回復:
首先請注意,您不需要printfelse 分支中的某些內容,因為這是由您的遞回函式基本案例管理的。
要列印索引,最簡單的解決方案(如果我們排除全域變數)是為您的遞回函式提供一個額外的指標引數,該引數參考一個整數,即列印的行數。每次列印一行時,此指標參考的整數都會增加 1。這給出了tower_ptr以下函式:
#include <stdio.h>
void tower_ptr(int * index, int disk, int src, int tmp, int dst) {
if(disk == 1) {
(*index) ;
printf("%d. move %d -> %d\n", *index, src, dst);
} else {
tower_ptr(index, disk - 1, src, dst, tmp);
tower_ptr(index, 1, src, - 1, dst);
tower_ptr(index, disk - 1, tmp, src, dst);
}
}
int main() {
int index = 0;
int disk;
puts("enter disk");
scanf("%d", &disk);
tower_ptr(&index, disk, 1, 2, 3);
return 0;
}
另一種解決方案是為您的函式提供一個附加引數,該引數是要列印的下一個索引。該函式回傳列印的索引數。這給出了tower_int以下功能:
#include <stdio.h>
int tower_int(int index, int disk, int src, int tmp, int dst) {
if(disk == 1) {
printf("%d. move %d -> %d\n", index 1, src, dst);
return index 1;
} else {
index = tower_int(index, disk - 1, src, dst, tmp);
index = tower_int(index, 1, src, - 1, dst);
index = tower_int(index, disk - 1, tmp, src, dst);
return index;
}
}
int main() {
int index = 0;
int disk;
puts("enter disk");
scanf("%d", &disk);
tower_int(0, disk, 1, 2, 3);
return 0;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/405888.html
標籤:
