gpt4 book ai didi

c - 静态函数可以递归吗?

转载 作者:太空狗 更新时间:2023-10-29 15:11:10 26 4
gpt4 key购买 nike

是否可以用 C 编写递归静态函数?

最佳答案

是的,绝对是。当您将 static 应用于函数时,它与递归函数中的静态变量不同(如果在计算中使用它,一个问题)。

当应用于函数(或函数外的对象)时,static 仅控制该事物是否在编译单元外可见(例如,对于链接器)。

当应用于函数的对象时,static 表示变量存在于函数持续时间之外。在递归函数的上下文中,这也意味着对于所有递归级别只有一个变量副本,而不是每个递归级别一个, em> 这通常是需要的。

所以这个(你的问题似乎在问什么)完全没问题:

static unsigned int fact (unsigned int n) {
if (n == 1U) return 1;
return n * fact (n-1);
}

另一方面,这不行好,因为静态变量的单个副本可能会被较低的递归层破坏。

static unsigned int fact (unsigned int n) {
static unsigned int local_n;
local_n = n;
if (local_n == 1U) return 1;
return fact (local_n - 1) * local_n;
}

更详细地,考虑对 fact(3) 的调用:

  • 在第一个递归层中,local_n设置为3,然后调用fact(2)
  • 在第二层,local_n设置为2,调用fact(1)
  • 在第三层中,local_n 设置为 1,我们只返回 1,因为这是递归的基本情况。

那是事情似乎开始出错的时候(尽管从技术上讲,当我们为 local_n 声明符输入 static 关键字时,它们就开始出错了):

  • 回到第二层,我们收到1并将它乘以local_n。现在,如果该变量不是 是静态的,它将具有2 的(本地)值。不幸的是,它静态的,因此在上一步中被设置为1。因此我们返回 1 * 1 或者,...等等,让我在计算器上检查一下...,1 :-)
  • 同上回到第一层,我们收到 1 并将其乘以 local_n,当然,它仍然具有值 1。所以我们再次乘以 1 * 1 并返回 1

如果你想尝试一下,这里有一个完整的程序:

#include <stdio.h>

static unsigned int fact (unsigned int n) {
static unsigned int local_n; // bad idea!
local_n = n;
if (local_n == 1U) return 1;
return fact (local_n - 1) * local_n;
}

int main() {
printf("%d\n", fact(3));
return 0;
}

这会输出错误的 1 但是,如果您去掉 local_n 声明符中的 static 关键字,它将返回正确的 6

关于c - 静态函数可以递归吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2887720/

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