gpt4 book ai didi

c - 递归过程

转载 作者:太空宇宙 更新时间:2023-11-04 06:14:56 24 4
gpt4 key购买 nike

我的问题是关于递归的,我有点难以理解一点。我调试了一小段代码,我知道流程是如何工作的,但问题是为什么以及如何?我会解释我的疑问。

我知道这样问可能很愚蠢,但请澄清一下。

检查代码 -:

#include <stdio.h>

void sum(int n);
void add(int number);

int main()
{
int number, result;

printf("Enter a positive integer: ");
scanf("%d", &number);
sum(number);
}

void sum(int num)
{
if (num!=0) {
sum(num - 1); //(2-1) (1-1)
sum(num - 1); // (1-1) (2-1)
add(num);
}

}

void add(int number){
int a = 5;
int c = 0;
c = a+number;

printf("%d ",c);
}

当我给用户输入 2 时,流程转到 if 条件 -> Valiadte -> 进入内部 -> 首先调用 sum (2-1) ->再次上升 -> 验证 -> 调用第一个 sum (1-1) -> 退出 if -> 调用第二个 sum (1 -1) -> 退出 if -> 调用 add 函数 -> 现在再次调用 sum (2-1) -> 验证 if -> 调用第一个 sum (1-1) -> 退出 -> 再次调用第二个 sum(1-1) -> 调用 添加 -> 退出。

Recursion 定义说-:当函数调用自身时它是递归的,递归一直持续到满足某些条件为止。

我的问题是为什么第二个总和被调用了 2 次或更多次?我的意思是,如果您看到它在第一次调用时满足条件 (1-1),那么它应该退出并只调用 add,但是在调用 add 之后它又会运行对于 (2-1)。第二个 Sum 是否以相反的顺序被调用?

如果 first 被调用 123 那么即使在满足条件之后 second 也必须去 321 吗?递归过程实际上是这样工作的吗?谁能解释这个概念?


我的问题有一点更新。我删除了第二个内部函数调用,现在只剩下一个内部递归函数。检查更新的代码-:

void sum(int num)
{

if (num != 0) {
sum(num - 1);
}

if (num==2) {
printf("Back to memory address of 2 , you can exit out of function now ");
}

}

输入 = 总和 (2)。现在当 sum 变为 sum(1-1)sum(0) -> 退出 if 。我看到调用没有结束 function 。 num 的值再次遍历回 2 going(0->1>2) -> goes inside if (num ==2) -> 在控制台打印 -> 退出函数。

这说明什么?如果我猜测它是否像-:内部调用作为按值传递而不是引用?因此,即使内部递归函数正在更新 num 的值,它也不会更改 memory address 的值,它仍然是 2

流程也是这样的 - :

sum(2) 实际内存地址值 -> sum(1) 复制值 -> sum(0) 复制值。好的,现在我可以离开 if 了。

但是等等!!我无法退出功能,num 必须返回并使用实际内存地址值进行更新 -:

num = 0 , num=1 , num=2(这就是我要找的) 。伟大的!!功能失灵。

这是怎么回事??我仍然有点卡住。

最佳答案

添加一些简单的 printf 语句并跟踪全局 depth 变量中的“调用深度”可以很好地表示正在发生的事情:

int depth = 0;
void sum(int num)
{
for(int i = 0; i < depth; ++i) printf("\t");
printf("-> sum | depth: %d | num: %d\n", depth, num);
++depth;

if (num != 0) {
sum(num - 1);
sum(num - 1);
add(num);
}

--depth;
}

输入2:

-> sum | depth: 0 | num: 2
-> sum | depth: 1 | num: 1
-> sum | depth: 2 | num: 0
-> sum | depth: 2 | num: 0
add: 6
-> sum | depth: 1 | num: 1
-> sum | depth: 2 | num: 0
-> sum | depth: 2 | num: 0
add: 6
add: 7

您还可以在sum 的末尾打印,以查看函数何时退出:

-> sum | depth: 0 | num: 2
-> sum | depth: 1 | num: 1
-> sum | depth: 2 | num: 0
<- sum | depth: 2 | num: 0
-> sum | depth: 2 | num: 0
<- sum | depth: 2 | num: 0
add: 6
<- sum | depth: 1 | num: 1
-> sum | depth: 1 | num: 1
-> sum | depth: 2 | num: 0
<- sum | depth: 2 | num: 0
-> sum | depth: 2 | num: 0
<- sum | depth: 2 | num: 0
add: 6
<- sum | depth: 1 | num: 1
add: 7
<- sum | depth: 0 | num: 2

live example on wandbox

关于c - 递归过程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47848695/

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