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只能记住一个返回地址。

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

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

更重要的是,当第二次调用 B 时,第一次调用 B 的所有局部变量和参数都被破坏了。

于 2013-02-05T16:21:52.640 回答
1

提问者提出的多项选择题是一个误导性问题,因为虽然该语言的最古老版本缺乏递归支持,但 FORTRAN 语言的现代版本确实允许递归。

语言实现是否支持递归应该被视为语言方言定义功能的方式以及实现的一致性程度的问题。

于 2013-05-01T19:44:23.593 回答