回 帖 发 新 帖 刷新版面

主题:[讨论]纠结的递归

[em10]请各位大虾指点一下,下面这个程序是怎样实现递归的,希望能叙述得尽量清楚些,小弟是新手!    
[code=c]
int f(int a[ ],int n)       
{if(n>1) return a[0]+f(&a[1],n-1);/*就是这句及下一句,是怎样实现递归的*/
 eles return a[0];
}
void main( )
{ int aa[3]={1,2,3},s;
 s=f(&aa[0],3);
 printf("%d\n",s);
}
[/code]

回复列表 (共8个回复)

沙发

老实说刚学递归的时候也不是半懂不懂,等学到栈的时候就理解了
LZ你想深入的理解就去把栈搞懂就可以了

板凳

[code=c]
int f(int a[ ],int n)       
{if(n>1) return a[0]+f(a[1],n-1);/*就是这句及下一句,是怎样实现递归的*/
 eles return a[0];
}
[/code]
这个函数=n*a[0]
我感觉这个函数的本意应该是
[code=c]
int f(int a[ ],int n)       
{if(n>1) return a[n-1]+f(a,n-1);//改了下
 eles return a[0];
}
[/code]
这个结果是数组内数求和

3 楼

“怎样实现递归”?递归从实现上看就是把函数的自我调用作为返回的出口之一。
return a[0]+f(a[1],n-1);这里返回的时候调用了函数自身,在函数满足其他出口(即return a[0])之前,函数会不断调用自身进行计算

4 楼

在被调用函数中,      return a[0]+f(a[1],n-1);这一语句中,为什么不是     return a[0]+f(&a[1],n-1);这样呢?

5 楼

你给出的代码有错,呵呵

6 楼


没错呀,我原也以为是代码错了,但运行后没错,的确是求数组各元素的和

7 楼

我很好奇如果你不是用&a[1]的话你是用什么编译器通过编译的……

8 楼


[code=c]
int f(int a[],int n)
{
    if(n>1) return a[n-1]+f(a,n-1); 
    else return a[0];
}
void main( )
{ int aa[7]={1,2,3,2,2,2,2},s;
s=f(&aa[0],7);
printf("%d\n",s);
}
[/code]
摸索去吧

我来回复

您尚未登录,请登录后再回复。点此登录或注册