電子書籍の厳選無料作品が豊富!

プログラミング初心者です。

サブルーチンを用いて、ハノイの塔の解を求める課題で詰まっています。
解自体は求めることができたのですが、それぞれの解の順番(輪を移動させる順番)を一緒に表示させよという指示が出ており、この方法がわかりません。

表示順に上から番号を振るという考え方でよろしいのでしょうか。
まず考え方自体が違うようであれば、そこから指摘して頂きたいと思います。




よろしくお願いします。

ちなみに現状ではこのようになっております。
#!/usr/bin/perl



sub hanoi {
my ($no , $x , $y , $z) = @_;

if( $no = $no){
hanoi ($no-1,$x,$z,$y);

print "Move", $no ,"from" , "$x" , "to" , "$z" , "\n";

hanoi ($no-1,$y,$x,$z);
}
}


print"入力された枚数のハノイの塔の解(順番付き)\n";
$data=<>*1;
hanoi($data , "A" , "B" , "C");

A 回答 (2件)

「解の順番」というのは、以下のようなアウトプットを想定していると言うことでしょうか?



入力された枚数のハノイの塔の解(順番付き)
(1) Move 1 from A to C
(2) Move 2 from A to B
(3) Move 1 from C to B
(4) Move 3 from A to C
(5) Move 1 from B to A
(6) Move 2 from B to C
(7) Move 1 from A to C

だとすれば、以下のような以下のようなスクリプトになります。

--------------------------------------------------------------------------------------------
sub hanoi {
my ($no , $x , $y , $z) = @_;

if($no==1){
$cnt++;
print"($cnt) Move ", $no ," from " , "$x" , " to " , "$z" , "\n";
}
else{
hanoi ($no - 1,$x,$z,$y);
$cnt++;
print"($cnt) Move ", $no ," from " , "$x" , " to " , "$z" , "\n";
hanoi ($no - 1,$y,$x,$z);
}
}

print"入力された枚数のハノイの塔の解(順番付き)\n";
$cnt=0;
$data=3;
hanoi($data , "A" , "B" , "C");

--------------------------------------------------------------------------------------------
    • good
    • 0

"Move" の後に表示される数字は、小さい順から付けられた輪の名称になります。

3枚で実行すると、次のように表示されます。

Move1fromAtoC
Move2fromAtoB
Move1fromCtoB
Move3fromAtoC
Move1fromBtoA
Move2fromBtoC
Move1fromAtoC

初期状態の A のポールに 1, 2, 3 の輪が積まれているのを想起すれば、どの輪を移動したかわかるので適切な表示だと思います。指示の意味がもう1つわからないところがありますが.....。

1
2
3
A B C
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!