gpt4 book ai didi

c - 为什么我们不能使用静态变量来实现尾递归呢?

转载 作者:太空宇宙 更新时间:2023-11-04 00:51:18 25 4
gpt4 key购买 nike

我正在学习 C,所以我正在写一些 little exercises in C练习语言。

我有使用函数式代码的经验,所以我喜欢递归。我认为使用 C 静态变量实现尾递归会很棒,因此不需要额外的参数或辅助函数。

这段使用递归计算阶乘的代码失败了:

long long int fact(int n)
{
static long long int result = -1;

if(n <= 0) {
if(result < 0)
return 1;
else {
long long int temp = result;
result = -1;
return temp;
}
} else {
result *= n;
fact(n - 1);
}
}

但是,出于某种原因,我不能在 C 中执行此操作。是否有相同的成语?这只是我的编译器吗?记忆化呢?

非常感谢。

最佳答案

您的代码已损坏,因为它有一个不返回值的控制路径。 This works fine :

long long int fact(int n)
{
static long long int result = 1;

if(n <= 1) {
long long int temp = result;
result = 1;
return temp;
} else {
result *= n;
return fact(n - 1);
}
}

GCC does successfully transform the tail recursion to iteration .

总的来说,我认为避免将静态用于尾递归的原因很简单,因为该函数失去了可重入性。如今,如此多的代码最终不得不在多线程环境中运行,以至于很难证明在代码中留下函数局部静态“地雷”是合理的。我承认这既是技术论点也是观点。非静态尾递归代码:

static inline long long int fact_(int n, long long int result)
{
if(n <= 1) {
return result;
} else {
return fact_(n - 1, result * n);
}
}

long long int fact(int n)
{
return fact_(n, 1);
}

是否更容易编写 - 特别是两个版本都是 13 LOC - 和 compiles just as efficiently to iteration but without needing static data .

关于c - 为什么我们不能使用静态变量来实现尾递归呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18095582/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com