C编程递归

C编程递归,c,visual-studio,recursion,C,Visual Studio,Recursion,今天我进入了C,我碰到了这个使用递归调用的例子,我不明白它是如何工作的。有人能解释一下吗? #include <stdio.h> #define SIZE 10 int sample(const int b[], int p); //function prototype void main(void){ int x; int a[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 }; x = sample(a, SI


今天我进入了C,我碰到了这个使用递归调用的例子,我不明白它是如何工作的。有人能解释一下吗?

#include <stdio.h> 
#define SIZE 10 

int sample(const int b[], int p); //function prototype

void main(void){
    int x; 

    int a[SIZE] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };

    x = sample(a, SIZE); //call

    printf("Result is X: %d\n", x);
}

int sample(const int b[], int p){
    if (p == 1){
        return b[0];
    }
    else{
        return b[p - 1] + sample(b, p - 1); //recursive calls until p is 1
    }
}
#包括
#定义尺寸10
int样本(常数int b[],int p)//功能原型
真空总管(真空){
int x;
inta[SIZE]={1,2,3,4,5,6,7,8,9,10};
x=样本(a,大小);//调用
printf(“结果是X:%d\n”,X);
}
整数样本(常数整数b[],整数p){
如果(p==1){
返回b[0];
}
否则{
返回b[p-1]+sample(b,p-1);//递归调用,直到p为1
}
}

我的问题是:为什么产量是55?x是否保存上一个值,然后从样本的下一次调用中添加下一个值?为什么x的值不只是b[0]即1?

答案是55,因为这是所有10项的总和。
它所做的是把最后一项和其他项相加。当出现第一个项时,它返回该项,结束递归并弹出整个堆栈。

答案是55,因为这是所有10个项的总和。
它所做的是把最后一项和其他项相加。当出现第一个项时,它返回该项,结束递归并弹出整个堆栈。

答案是55,因为这是所有10个项的总和。
它所做的是把最后一项和其他项相加。当出现第一个项时,它返回该项,结束递归并弹出整个堆栈。

答案是55,因为这是所有10个项的总和。
它所做的是把最后一项和其他项相加。当出现第一个术语时,它返回该值,结束递归并弹出整个堆栈。

之所以会出现这种情况,是因为当您执行上述代码时,递归函数调用输出的内存堆栈就形成了,直到出现一个控制条件,就像我们在本例中看到的那样

 if (p == 1){
        return b[0];
    }
因此,在递归的每个级别上得到的值如下 10987654321

加上所有这些,你得到55

x的值不仅仅是1,因为每个递归函数调用p的递减值的返回值相加,以计算每次调用时上一次调用的返回值,直到它达到1(父调用中的条件)。 ie
返回b[p-1]+样本(b,p-1)


有关简要说明,请参阅:

之所以会发生这种情况,是因为当您执行上述代码时,会形成递归函数调用输出的内存堆栈,直到出现与本例类似的控制条件

 if (p == 1){
        return b[0];
    }
因此,在递归的每个级别上得到的值如下 10987654321

加上所有这些,你得到55

x的值不仅仅是1,因为每个递归函数调用p的递减值的返回值相加,以计算每次调用时上一次调用的返回值,直到它达到1(父调用中的条件)。 ie
返回b[p-1]+样本(b,p-1)


有关简要说明,请参阅:

之所以会发生这种情况,是因为当您执行上述代码时,会形成递归函数调用输出的内存堆栈,直到出现与本例类似的控制条件

 if (p == 1){
        return b[0];
    }
因此,在递归的每个级别上得到的值如下 10987654321

加上所有这些,你得到55

x的值不仅仅是1,因为每个递归函数调用p的递减值的返回值相加,以计算每次调用时上一次调用的返回值,直到它达到1(父调用中的条件)。 ie
返回b[p-1]+样本(b,p-1)


有关简要说明,请参阅:

之所以会发生这种情况,是因为当您执行上述代码时,会形成递归函数调用输出的内存堆栈,直到出现与本例类似的控制条件

 if (p == 1){
        return b[0];
    }
因此,在递归的每个级别上得到的值如下 10987654321

加上所有这些,你得到55

x的值不仅仅是1,因为每个递归函数调用p的递减值的返回值相加,以计算每次调用时上一次调用的返回值,直到它达到1(父调用中的条件)。 ie
返回b[p-1]+样本(b,p-1)


有关简要说明,请参阅:

在第一次调用
sample
时,编写一个
p
值表可能会有所帮助:

p          b[p - 1]
--------   --------
SIZE       10
由于
p
不是
1
,因此函数
sample
返回计算结果:

b[SIZE - 1] + sample(b, SIZE - 1)
或:

为了计算样本(b,尺寸-1)
,我们在表中写出下一个值:

p          b[p - 1]
--------   --------
SIZE - 1   9
同样,
p
不是
1
,因此我们最终返回以下值:

(10 + (9 + sample (b, (SIZE - 1) - 1)))
如果您重复这些步骤,您可以看到这最终是如何终止的,因为我们进入了
p
1
的状态:

(10 + (9 + (8 + ... + (1)))

这就得到了答案
55

可能有帮助的是在第一次调用
sample
时写出
p
的值表:

p          b[p - 1]
--------   --------
SIZE       10
由于
p
不是
1
,因此函数
sample
返回计算结果:

b[SIZE - 1] + sample(b, SIZE - 1)
或:

为了计算样本(b,尺寸-1)
,我们在表中写出下一个值:

p          b[p - 1]
--------   --------
SIZE - 1   9
同样,
p
不是
1
,因此我们最终返回以下值:

(10 + (9 + sample (b, (SIZE - 1) - 1)))
如果您重复这些步骤,您可以看到这最终是如何终止的,因为我们进入了
p
1
的状态:

(10 + (9 + (8 + ... + (1)))

这就得到了答案
55

可能有帮助的是在第一次调用
sample
时写出
p
的值表:

p          b[p - 1]
--------   --------
SIZE       10
由于
p
不是
1
,因此函数
sample
返回计算结果:

b[SIZE - 1] + sample(b, SIZE - 1)
或:

为了计算样本(b,尺寸-1)
,我们在表中写出下一个值:

p          b[p - 1]
--------   --------
SIZE - 1   9
同样,
p
不是
1
,因此我们最终返回以下值:

(10 + (9 + sample (b, (SIZE - 1) - 1)))
如果你重复这些步骤,