C程序:如何读取这个递归程序
这段代码让我迷惑不解,读了这个程序谁能告诉我这个程序是如何运行的C程序:如何读取这个递归程序,c,C,这段代码让我迷惑不解,读了这个程序谁能告诉我这个程序是如何运行的 #include<stdio.h> int box(int a, int b){ if(a>b) { return 1 +box(a-1, b); } else if(a<b) { return 1 + box(a,b-1); } else { return a+b; } } int m
#include<stdio.h>
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b)
{
return 1 + box(a,b-1);
}
else
{
return a+b;
}
}
int main(){
printf("%d", box(12,17));
return 0;
}
#包括
整数框(整数a,整数b){
如果(a>b)
{
返回1+盒(a-1,b);
}
否则如果(a我们可以添加一些printf
调用来查看发生了什么:
#包括
整数框(整数a、整数b、整数深度){
++深度;
如果(a>b){
printf(“%s:depth=%d,%d>%d\n”,“函数,深度,a,b”);
printf(“返回1+%s(%d-1,%d)\n”,uu func_uu,a,b);
返回1+框(a-1,b,深度);
}
否则如果(a
输出
框:深度=1,12<17
返回1+框(12,17-1)
框:深度=2,12<16
返回1+框(12,16-1)
方框:深度=3,12<15
返回1+框(12,15-1)
框:深度=4,12<14
返回1+框(12,14-1)
方框:深度=5,12<13
返回1+框(12,13-1)
框:深度=6,12=12
返回12+12
29
解释
程序遵循a
路径,直到a=12
和b=12
。然后返回12+12
。最终值为
24+1+1+1+1+1=29
注意
我修改了框
以接受深度
参数。使用静态
变量可能导致深度
值不正确。这是一个递归函数
首先注意重现性的“停止条件”。这里是a==b(最后一个),因此函数返回a+b
第二件事请记住,调用堆栈以及a和b的值在每个调用级别都是正确的
如果a
示例:框(2,4)
方框(2,4)==1+方框(2,3)==1+(1+方框(2+2))==(1+(1+(2+2)))其他答案指出了这种代码的一种方法是查看基本情况。
这种情况下,不会进行递归调用(在调用box
时调用box
)。
必须有一个或所有调用将调用框
,您将得到此站点命名的错误-堆栈溢出
通过观察if-else链,我们可以看到如果a>b,它会递归调用,如果ab,我们返回n+b+b,但那只是a+b。
通过类似的论证,如果b>a,我们也会这样做
该函数是一种计算a+b的循环方法,通过将较大的变量减少1,并(实际上)合计我们减少了多少,以得到较小的变量
最重要的一点是,当面对递归函数时,使用一些基本情况(这里A==b)研究(并测试)它,然后处理一些递归一次、再递归两次的情况,依此类推,直到模式变得清晰为止
根据我的经验,当您研究或构建递归函数时,您应该:
测试基本情况。没有递归/
测试一次递归的案例
然后测试递归两次的用例
然后开始测试反复出现几次(4,5)或更多(8,15)的案例
最后测试一些反复出现几十次的怪物
您可以将测试的递归深度以指数形式增加,每次大约增加一倍,并且只需完成少量测试
(*)确定递归函数的功能通常需要理解“归纳”,因为递归函数本质上是一种递归关系。
如果你的数学背景不包括减法,我推荐一本快速入门
是的,我知道他们告诉过你计算机科学不要求你擅长数学。他们撒了一点谎。你需要一些
下面是一个玩具单元测试,它确认了框(a,b)=a+b
#包括
整数框(整数a,整数b){
如果(a>b)
{
返回1+盒(a-1,b);
}
否则,如果(a首先执行主
int main(){
printf("%d\n", **box(12, 17)**); //this functions calls
return 0;
}
第一次迭代
我们知道a=12和b=17
int框(int a,int b){
如果(a>b)
{
返回1+盒(a-1,b);
}
否则如果(ab)
{
返回1+盒(a-1,b);
}
否则如果(ab)
{
返回1+盒(a-1,b);
}
否则如果(ab)
{
返回1+盒(a-1,b);
}
否则如果(ab)
{
返回1+盒(a-1,b);
}
否则如果(ab)
{
返回1+盒(a-1,b);
}
else if(abox()
函数将返回a和b的和。如果a!=b,该函数将递归| a-b |次。在每次迭代中,向最终和添加一次以弥补减量,从而最终建立等式并终止递归(a==b)你为什么要声明深度
静态?非常感谢你的解释:)非常感谢你的解释:)非常感谢你的解释:)非常感谢你的解释:)非常感谢你的解释:)
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b) **// this will be execute**
{
return 1 + box(a,b-1); //now b=16 and return has 1
}
else
{
return a+b;
}
}
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b) **// this will be execute**
{
return 1 + box(a,b-1); //now b=15 and return has 1+1
}
else
{
return a+b;
}
}
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b) **// this will be execute**
{
return 1 + box(a,b-1); //now b=14 and return has 1+1+1
}
else
{
return a+b;
}
}
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b) **// this will be execute**
{
return 1 + box(a,b-1); //now b=13 and return has 1+1+1+1
}
else
{
return a+b;
}
}
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b) **// this will be execute**
{
return 1 + box(a,b-1); //now b=12 and return has 1+1+1+1+1
}
else
{
return a+b;
}
}
int box(int a, int b){
if(a>b)
{
return 1 +box(a-1, b);
}
else if(a<b) **// this will be execute**
{
return 1 + box(a,b-1);
}
else
{
return a+b; *//as we know a=12 and b=12 and return has 1+1+1+1+1 so total is 28*
}
}