ハノイの塔を非再帰でスタックを利用して実現したいです。一例としてC言語では以下のとおりらしいのですが、
これをほぼ同じ考え方でpythonでやろうとすればどうしたらいいでしょうか
どうしても分からず悩んでいます。大変お手数ですが教えていただきたくお願い致します。
C言語
1#include <stdio.h> 2 3/*--- 円盤をx軸からy軸へ移動 ---*/ 4void hanoi(int no, int x, int y) 5{ 6 int xstk[100], ystk[100], sstk[100]; /* スタック */ 7 int ptr = 0; /* スタックポインタ */ 8 int sw = 0; 9 10 while (1) { 11 if (sw == 0 && no > 1) { 12 xstk[ptr] = x; /* xの値をプッシュ */ 13 ystk[ptr] = y; /* yの値をプッシュ */ 14 sstk[ptr] = sw; /* swの値をプッシュ */ 15 ptr++; 16 no = no - 1; 17 y = 6 - x - y; 18 continue; 19 } 20 printf("[%d]を%d軸から%d軸へ移動\n", no, x, y); 21 if (sw == 1 && no > 1) { 22 xstk[ptr] = x; /* xの値をプッシュ */ 23 ystk[ptr] = y; /* yの値をプッシュ */ 24 sstk[ptr] = sw; /* swの値をプッシュ */ 25 ptr++; 26 no = no - 1; 27 x = 6 - x - y; 28 if (++sw == 2) sw = 0; 29 continue; 30 } 31 do { 32 if (ptr-- == 0) /* スタックが空になったら */ 33 return; 34 x = xstk[ptr]; /* 値を保存していたxをポップ */ 35 y = ystk[ptr]; /* 値を保存していたyをポップ */ 36 sw = sstk[ptr] + 1; /* 値を保存していたswをポップ */ 37 no++; 38 } while (sw == 2); 39 } 40} 41 42int main(void) 43{ 44 int n; /* 円盤の枚数 */ 45 46 printf("円盤の枚数:"); 47 scanf("%d", &n); 48 49 hanoi(n, 1, 3); 50 51 return (0) 52コード
目的はこのコードを理解することですか?
それとも Python のコードさえ手に入ればいいんですか?
ご連絡ありがとうございます。
Pythonのコードをいただきたいです。内容理解は自分で頑張ってみます。
https://teratail.com/help/avoid-asking
> 何かを作りたいのでコードを書いてほしい、学校の課題を解いてほしい等の質問は、具体的にプログラミングで困っている質問ではないと考え、推奨していません。
> 問題や質問は実際に調査や作業に取り組み、具体的なところで生まれると考えるためです。
> まずは実際に作業に取り組み、つまづいたところで投稿をしてみてください。
つまり、適当に探した意味もわからない C のコードを載せて「あとよろしく」というのではなく、自分でプログラミングするにあたってつまずいた「部分」について質問してください。「どこから手を付けていいかまるでわからない」のであれば、もっと基礎に戻ってやり直してください。
この課題の場合、まず Python で再帰を使ったコードを書き、それをスタックを使って書き直すという手順がやりやすいと思います。
なお、推奨していない質問には低評価が付き、回答がつきにくくなるシステム的なペナルティも課されます。
https://teratail.com/help#about-questionevaluation
> 低評価がつく質問
>
> プログラミングに関係のない質問
> やってほしいことだけを記載した丸投げの質問
> 問題・課題が含まれていない質問
> 意図的に内容が抹消された質問
> 過去に投稿した質問と同じ内容の質問
> 広告と受け取られるような投稿
https://teratail.com/help/avoid-asking
> 推奨していない質問
>
> プログラミングに関係のない質問
> コードをください・デバッグしてください等の丸投げの質問
> 問題・課題が含まれていない質問
> 意図的に内容が抹消された質問
> 過去に投稿した質問と同じ内容の質問
> 広告と受け取られるような質問