语言必须具有哪些属性才能支持递归?

时间:2013-02-02 15:16:10

标签: paradigms

我正在研究递归,我遇到了这个问题:

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)

但我想知道编程语言应该支持递归的所有功能。

有人可以解决我的疑问吗

提前致谢

2 个答案:

答案 0 :(得分:4)

函数或子程序中的局部变量(包括其返回地址)在被调用时应该是一个新的副本。

通常这是使用堆栈架构完成的。每当调用一个函数时,它的参数被压入堆栈,然后推送它的返回地址,然后“推”一块内存(通过递减堆栈指针足够的量)。 一个特殊寄存器,“帧指针”设置为指向该存储器,该函数通过引用该寄存器来引用其所有局部变量。

其他语言不使用物理硬件堆栈,而是使用实现为链接列表的逻辑硬件堆栈,但原理是相同的。

由于原始Fortrans没有这个概念,并且将所有变量存储在固定的全局位置,因此递归调用将崩溃或挂起。例如,如果A调用B调用C调用B,则B返回C,返回B,无限制地返回到C,因为B只能记住一个返回地址。

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

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

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

答案 1 :(得分:1)

提问者提出的多项选择问题是一个误导性问题,因为尽管语言的最旧版本缺乏递归支持,但FORTRAN语言的现代版本允许递归。

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

相关问题