ここでこの質問をするのが適切かどうかはわかりませんが、プログラミングとコードが関係するので、ここが適切な場所であることを願っています。
Programmers and Computer Science SE に投稿しようとしましたが、このサイトにリダイレクトされました。
問題は、フィボナッチ数を計算するレジスタ マシン コード/プログラムをどのように作成できるかということです。コードの構文は、実際には非常に単純です。
(以下は参考用です。長い投稿で申し訳ありません)
(詳細については、Richard Carl Jeffrey による Formal Logic: Its Scope And Limits に関する本を参照してください)
ウィキペディアによると、レジスタ マシンは、チューリング マシンと同様の方法で使用される抽象マシンの一般的なクラスです。(プロセッサ) レジスタは、CPU またはその他のデジタル プロセッサの一部として使用できる少量のストレージです。
レジスターを空のバケツとしてモデル化することで問題を単純化でき、ビー玉や岩をレジスター (「バケツ」) に入れることができます。ルールは、ビー玉をバケツに追加または削除して計算を実行することです。
ルールは次のとおり
です。 1. レジスター マシンは有限数のバケツを使用し、ビー玉は際限なく供給されます。
2. 各バケットは個別に識別できます。ビー玉は区別できる必要はありません。
3. レジスタ マシン プログラムは、有限の命令セットです。
- ビー玉をバケットに追加する (そして次の命令に進む)。
- または、ビー玉をバケツから取り除く (そして、できる場合は次の指示に進み、できない場合は別の指示に進みます)。
4. プログラムは、フローチャートまたは命令リストで記述できます。
これは、加算を実行するレジスタ マシン プログラムの例です。
A、B、C をバケットとします。
1. (-B; 2,4) は、バケツ B からビー玉を 1 つ取り除くことを意味し、できる場合は命令 2 に進み、できない場合は 4
に進みます。 3
3. (+C; 1) は、バケツ C にビー玉を 1 つ追加し、命令 1 に進むことを
意味します。できない場合
5. (+B; 4) は、バケツ B にビー玉を 1 つ追加し、手順 4 に進むことを意味します。
バケツ A に 3 個のビー玉があり、バケツ B に 2 個のビー玉があり、バケツ C に 4 個のビー玉があると仮定すると、簡単に示されます。このアルゴリズムを実行すると、|A|+|B| になります。= 3+2 = バケツ A と |B|+|C| に 5 個のビー玉 = 2+4 = バケツ B に 6 個のビー玉。
(上記の例が説明目的で十分に明確であることを願っています)
(さて、ここで質問です)
ここで、バケット A に n を入力すると、(バケット A にも) n 番目のフィボナッチ数を返すレジスタ マシン コードを書きたいと思います。フィボナッチ数は、0 (0 番目)、1 (1 番目)、1 = 0 + 1 (2 番目) などです。任意の数のバケットを使用できます。目標は、コードをできるだけ単純に記述することです (つまり、指示が最も少ない)。フィボナッチ再帰関係は、F(0)=0 および F(1)=1 の場合、F(n)=F(n-1)+F(n-2) です。
ここに私の試みとコードがあります:
私の考えは、バケット A を入力として、最後に出力 F(n) として使用することです (質問にはバケット A の出力が必要なので)、バケット B を「カウンター」として、バケット C を F として使用します。 (n-1) であり、バケット D は F(n-2) です。
1. (+C; 2)
2. (-A; 3,4)
3. (+B; 2)
4. (-D; 5,7)
5. (+A; 4)
6. (-C; 5,7)
7. (-B; 6,-)
しかし、残念ながら私のコードは最大 n=2 でしか機能しません。コードを n>2 で機能させるのに苦労しています。
私はこの昼夜を問わず考えてきました。誰かがこれについて私を助けてくれれば幸いです。ご不明な点がございましたら、お気軽にお問い合わせください。
よろしくお願いします!