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)))
如果你重复这些步骤,