1

単刀直入に言えば、私はブレインファックを学んでいますが、再帰のアイデアを理解するのに苦労しています。私はこれをグーグルで検索し、フォーラムを検索しました-必要に応じて事前に謝罪します-そして何も思いつきません.

そもそも、それって本当に可能なの?

もしそうなら、例はありますか?思いついた便利なものは何でも追加します。

私は具体的に再帰を使用してフィボナッチ数を計算しようとしているので、それに基づいて計算できれば非常に役立ちます。

4

3 に答える 3

5

BF は実際にはテープとポインター、および非常に基本的なループ機能以外には何も提供していないため (通常、ポインターが開始時と同じ場所で終了することを確認する必要があります。これはバランス ループと呼ばれます。まれに、次のことができます。配列のようにバランスを取らずにループを実行する場合)、再帰アルゴリズムを実装するのは非常に困難です。bf で「通常の」コンピュータをシミュレートしてみてください (テープの扱い方によって異なります)。私は、C2BF プロジェクトがこのように機能すると信じています (C をコンパイルしてbrainfuck にします)。私が間違っていなければ、スタック/ヒープの交互のペアでセルのグループを扱います(すべてを2倍する必要があるため、特定のポインター操作が少し異なります)

というわけで、このテキストを最後に私の結論は次のとおりです。本当に難しいですが、brainfuck で再帰アルゴリズムを実装することは可能です。覚えておいていただきたいのは、すべての再帰アルゴリズムは繰り返し実行できるということです。独自のスタックを維持するだけです。これは、再帰的に実装したい場合、実際には最終的に行うことになります。しかし、再帰的ではなく、反復的で独自のスタックを維持していると考えると、実際に何をしているのかを理解しやすくなり、最終的にはより優れた設計のアルゴリズムが得られます。

于 2012-12-08T23:29:01.570 に答える
0

標準の Brainfuck には呼び出しも呼び出しスタックもないため、再帰的なプログラミングを行うには、独自のスタックを実装する必要があります。

2 次元言語 SNUSP は、Brainfuck と同じ演算子とメモリ モデルを備えていますが、コール スタックと ENTER ("@") および LEAVE ("#") 命令が追加されているため、再帰的なプログラミングが可能です。ループ用の Brainfuck のブラケットは、リフレクター ("\"、"/")、スキップ ("!")、およびスキップの場合はゼロ ("?") に置き換えられます。たとえば、フィボナッチ関数の再帰的な実装は次のとおりです。

             /========\    />>+<<-\  />+<-\
fib==!/?!\-?!\->+>+<<?/>>-@\=====?/<@\===?/<#
      |  #+==/     fib(n-2)|+fib(n-1)|
      \=====recursion======/!========/
于 2013-06-20T20:53:35.033 に答える