回 帖 发 新 帖 刷新版面

主题:数组与参数传递问题

#include<stdio.h>
#include<stdlib.h>
int f(int a[],int n)
{if(n>1) return a[0]+f(&a[1],n-1);
else return a[0];}
main()
{
  int aa[3]={1,2,3},s;
s=f(&aa[0],3);
printf("%d\n",s);
system("pause");
return 0; 
}
结果为什么是6,我得出的结果总是3;
想问一下这题的详细解题步骤;
我的步骤是:先运行第九行,主程序中的调用F函数,由于实际参数n值是3,故执行定义函数中的语句,即条件成立语句,之后n值减1,再重复运行,直到n值为1时执行else语句,此时s=a[0]+a[0]+a[0],三个a[0]的值怎么会得出6呢??郁闷中

回复列表 (共2个回复)

沙发

An = A1 + An-1,n>1
 An = A1,        n=1 
int f(int a[],int n)这个就相当于数列的递归求和,建议递归你用数学知识会好理解。    

板凳

f()函数是递归,第一次return是 a[0]+f(&a[1], n-1),那么这里再次调用f()函数,相当于把原始数据里的a[1]当作一个新的数组实参传进f(),f()函数接收到实参a[1]的地址后,就赋值,那么在函数内部就会把a[1]这个实参的值当作止函数本身形参数组的开始部份,也就认为是新的形参的a[0],第二次函数运行完后,由于n还>1,所以函数还要递归一次,所以第二次运行完的结果相当于原始数据a[0]+a[1],以后函数运行以此类推,f()函数运行完后的结果应该是a[0]+a[1]+a[2],所以终程序结果为1+2+3=6。
就始楼上所说,你把递归的知识再学学,就会理解了。

我来回复

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