gpt4 book ai didi

c - C语言递归函数的几个问题

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

这是一个获取数字数字总和的函数:

int sumOfDigits(int n)
{
int sum=0; //line 1
if(n==0)
return sum;
else
{
sum=(n%10)+sumOfDigits(n/10); //line 2
// return sum; //line 3
}
}

在编写这段代码时,我意识到局部变量的范围对于函数的每个单独递归都是局部的。那么我说的是否正确,如果 n=11111,每次递归都会创建 5 个 sum 变量并将其压入堆栈?如果这是正确的,那么当我可以使用循环在正常函数中执行递归时,使用递归有什么好处,从而只覆盖一个内存位置?如果我使用指针,递归可能会占用与普通函数类似的内存。

现在我的第二个问题,即使这个函数每次都给我正确的结果,我也看不到递归(除了最后一个返回 0 的)如何在不取消注释第 3 行的情况下返回值。(使用 geany 和 gcc )

我是编程新手,所以请原谅任何错误

最佳答案

So am I right in saying that if n=11111, 5 sum variables are created and pushed on the stack with each recursion?

从概念上讲,编译器可能会将某些形式的递归转换为跳转/循环。例如。进行尾调用优化的编译器可能会转

void rec(int i)
{
if (i > 0) {
printf("Hello, level %d!\n", i);
rec(i - 1);
}
}

相当于

void loop(int i)
{
for (; i > 0; i--)
printf("Hello, level %d!\n", i);
}

因为递归调用在尾部:调用时,rec 的当前调用除了return< 之外没有更多工作要做 给它的调用者,所以它也可以为下一个递归调用重用它的堆栈帧。

If this is correct then what is the benefit of using recursion when I can do it in normal function using loops, thus overwriting only one memory location? If I use pointers, recursion will probably take similar memory as a normal function.

对于这个问题,递归不太适合,至少在 C 语言中是这样,因为循环的可读性要好得多。然而,存在递归更容易理解的问题。树结构算法就是最好的例子。

(虽然每个递归都可以通过一个带有显式堆栈的循环来模拟,然后可以更容易地捕获和处理堆栈溢出。)

我不明白关于指针的评论。

I don't see how the recursions (other than the last one which returns 0) return values without uncommenting line 3.

偶然。该程序表现出未定义的行为,因此它可以做任何事情,甚至返回正确的答案。

关于c - C语言递归函数的几个问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16915213/

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