7

私は再帰について勉強していて、この質問に出くわしました:

FORTRAN implementations do not permit recursion because

a. they use static allocation for variables

b. they use dynamic allocation for variables

c. stacks are not available on all machines

d. it is not possible to implement recursion on all machines.

答えは (a) であることがわかりました。

しかし、プログラミング言語が再帰をサポートするために必要なすべての機能を知りたいです。

誰か私の疑問を解決してくれませんか

前もって感謝します

4

2 に答える 2

5

関数またはサブルーチンのローカル変数 (戻りアドレスを含む) は、呼び出されるたびに新しいコピーにする必要があります。

通常、これはスタック アーキテクチャを使用して行われます。関数が呼び出されるたびに、その引数がスタックにプッシュされ、次に戻りアドレスがプッシュされ、次にメモリ ブロックも「プッシュ」されます (スタック ポインターを十分な量だけ減らすことによって)。特殊なレジスタである「フレーム ポインタ」がそのメモリを指すように設定され、関数はそのレジスタを参照することによってすべてのローカル変数を参照します。

他の言語は物理ハードウェア スタックを使用せず、リンク リストとして実装された論理スタックを使用しますが、原理は同じです。

元の Fortrans にはこの概念がなく、すべての変数が固定されたグローバルな場所に格納されていたため、再帰呼び出しがクラッシュまたはハングしていました。たとえば、A が B を呼び出し、C が B を呼び出した場合、B は C に戻り、C は B に戻り、C は C に戻ります。B は 1 つの返信先アドレスしか覚えていないためです。

calls:  A -> B -> C -> B

returns:     B <- C <- B
             B -> C

さらに、B への最初の呼び出しのすべてのローカル変数と引数は、B への 2 回目の呼び出しが発生したときに上書きされます。

于 2013-02-05T16:21:52.640 に答える
1

質問者が尋ねる多肢選択式の質問は、誤解を招く質問です。言語の最も古いバージョンには再帰のサポートがありませんが、再帰を許可する FORTRAN 言語の最新バージョンがあるためです。

言語実装が再帰をサポートするかどうかは、言語の方言が関数を定義する方法と、実装の適合度の問題と見なされるべきです。

于 2013-05-01T19:44:23.593 に答える