【发布时间】:2017-12-17 14:38:11
【问题描述】:
我的问题是关于递归的,我有点难以理解一点。我调试了一小段代码,我知道流程是如何工作的,但质疑为什么以及如何工作?我会解释我的疑问。
我知道这可能是一个愚蠢的问题,但请清除我这个问题。
检查代码 -:
#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) -> 调用 add -> 退出.
Recursion 定义说——:当一个函数调用自己时它是一个递归,递归一直持续到满足某个条件来阻止它。
我的问题是为什么第二个总和被称为 2 次或更多次?我的意思是,如果您在第一次调用时看到它满足条件(1-1),那么它应该退出并只调用add,但在调用add 之后它再次调用(2-1)。第二个Sum 是否以相反的顺序被调用?
如果第一个被称为123 然后第二个必须去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 ");
}
}
Input = sum(2)。现在当sum 去sum(1-1) 或sum(0) -> exit if .我看到电话没有结束功能。 num 的值再次被遍历回 2 going(0->1>2) -> 进入 if (num==2) -> 在控制台上打印 -> 退出函数。
这说明什么?如果我猜是不是这样 - 内部调用是pass by value而不是reference?因此,即使内部递归函数也在更新 num 的值,它并没有改变 memory address 的值,它仍然是 2。
流程也是这样的 - :
sum(2)实际内存地址值->sum(1)复制值->sum(0)复制值。好的,现在我可以退出 if 了。
但是等等!!我无法退出功能,num 必须返回并使用实际内存地址值更新 - :
num = 0 , num=1 , num=2(That's what I was looking for ) 。伟大的!!功能失效。
这是怎么回事??我还是有点卡住了。
【问题讨论】:
-
您发布的代码根本不进行任何递归,它只是读取一个数字然后退出。您既不调用 sum 也不调用 main 中的 add。
-
C 和 C++ 是两种截然不同的语言。请仅使用您实际编程语言的标签。
-
@SornelHaetir 抱歉让我更新一下。
-
@Someprogrammerdude 对不起先生会记住的。
-
它调用
sum两次而不是一次的事实正是递归函数的定义方式。您确实可以在递归函数中进行多个递归调用。没有什么反对的。它只是完成了一种与只有一个算法不同的算法。事实上,这很常见,例如在树遍历函数中:traverse(node) { if (node == NULL) return; traverse(node->left); traverse(node-right); /* do something with current node */ }。