递归函数是否可重入

gol*_*ean 2 recursion reentrancy

我已经看到很多递归函数(主要用于计算一些数学运算,例如阶乘,数字中的数字之和等等),这些函数涉及使用保存每个递归调用/操作结果的静态变量,以及将它用于后续调用.

那么这会使递归函数非租用而不是线程安全的.

是否存在其他不需要静态变量的递归函数用例?

ang*_*son 10

这两个是不同的概念.一个并不意味着另一个,反之亦然.

例如,这是一个递归函数(假设语言)吗?

global sum = 0

proc accumulate(treeNode)
    sum += treeNode.Value
    if treeNode.Left then accumulate(treeNode.Left)
    if treeNode.Right then accumulate(treeNode.Right)
end
Run Code Online (Sandbox Code Playgroud)

显然它是一个递归函数,但由于使用了全局变量,它不是可重入的.在这里,"全球",至少我的意思是"不是功能的本地".

然而,这是一个不好的例子,因为通过简单地返回总和很容易使它完全不依赖于全局变量:

func accumulate(treeNode)
    sum = treeNode.Value
    if treeNode.Left then sum += accumulate(treeNode.Left)
    if treeNode.Right then sum += accumulate(treeNode.Right)
    return sum
end
Run Code Online (Sandbox Code Playgroud)

递归函数的概念中没有固有的东西使它成为非线程安全或可重入的,或者相反,它完全取决于你在函数中实际编写的内容.


Kon*_*lph 5

是否存在其他不需要静态变量的递归函数用例.

当然.实际上,递归函数中的静态变量应该是例外,而不是规则:

我已经看到很多递归函数(主要用于计算一些数学运算,例如阶乘,数字中的数字之和等等),这些函数涉及使用保存每个递归调用/操作结果的静态变量,以及将它用于后续调用.

这些都是非常坦率的糟糕实施.这里绝对不需要静态变量.他们可能充当蓄电池; 这可以通过将累加器作为额外参数传递来更好地完成.