主题:[讨论]纠结的递归
安泰007
[专家分:30] 发布于 2010-06-18 13:32:00
[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]
最后更新于:2010-06-21 14:58:00
回复列表 (共8个回复)
沙发
yxqyrh [专家分:1070] 发布于 2010-06-18 15:20:00
老实说刚学递归的时候也不是半懂不懂,等学到栈的时候就理解了
LZ你想深入的理解就去把栈搞懂就可以了
板凳
alweeq86 [专家分:1170] 发布于 2010-06-19 09:22:00
[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 楼
雪光风剑 [专家分:27190] 发布于 2010-06-19 09:34:00
“怎样实现递归”?递归从实现上看就是把函数的自我调用作为返回的出口之一。
return a[0]+f(a[1],n-1);这里返回的时候调用了函数自身,在函数满足其他出口(即return a[0])之前,函数会不断调用自身进行计算
4 楼
安泰007 [专家分:30] 发布于 2010-06-19 21:39:00
在被调用函数中, return a[0]+f(a[1],n-1);这一语句中,为什么不是 return a[0]+f(&a[1],n-1);这样呢?
5 楼
雪光风剑 [专家分:27190] 发布于 2010-06-19 22:27:00
你给出的代码有错,呵呵
6 楼
安泰007 [专家分:30] 发布于 2010-06-19 23:42:00
没错呀,我原也以为是代码错了,但运行后没错,的确是求数组各元素的和
7 楼
雪光风剑 [专家分:27190] 发布于 2010-06-20 07:21:00
我很好奇如果你不是用&a[1]的话你是用什么编译器通过编译的……
8 楼
alweeq86 [专家分:1170] 发布于 2010-06-20 09:12:00
[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]
摸索去吧
我来回复