调用函数

14号选手 2012-05-06 12:04:20
int fun(int *x,int n)
{
if(n==0)
return x[0];
else
return x[0]+fun(x+1,n-1);
}
main()
{
int a[]={1,2,3,4,5,6,7};
printf("%d\n",fun(a,3));
}
大家帮忙看下这个程序
vc跑出来的结果是10
可是怎么的出来的还是没有搞明白
能否给出详细的步骤?
...全文
116 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
玲仙 2012-05-06
  • 打赏
  • 举报
回复
另外跟你說
你是用vc的話 就應該學一下如何單步調試 多試幾次就懂的!
玲仙 2012-05-06
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

fun(a,3)
=a[0]+fun(&a[1],2)
=a[0]+a[1]+fun(&a[2],1)
=a[0]+a[1]+a[2]+fun(&a[3],0)
=a[0]+a[1]+a[2]+a[3]
=1+2+3+4
=10
[/Quote]
2樓正解
liuwons 2012-05-06
  • 打赏
  • 举报
回复
fun(a,3)
=a[0]+fun(&a[1],2)
=a[0]+a[1]+fun(&a[2],1)
=a[0]+a[1]+a[2]+fun(&a[3],0)
=a[0]+a[1]+a[2]+a[3]
=1+2+3+4
=10
PANHL97 2012-05-06
  • 打赏
  • 举报
回复
s[0]+a[1]+a[2]+a[3]=10
14号选手 2012-05-06
  • 打赏
  • 举报
回复
恩,知道了
地址变了,现在清楚了
[Quote=引用 7 楼 的回复:]

C/C++ code

#include<stdio.h>
/*
假设输出sum;

1.fun(a,3);传入a地址,即a[0]地址,*x=&a[0],n=3;

2.n!=0,执行return ( x[0]+fun(x+1,n-1) ),x[0]=a[0]=1.
再次调用fun(x+1,n-1);即调用fun(x+1,2);

此时sum=1+fun(x+1,2);

3.……
[/Quote]
whc12345whc 2012-05-06
  • 打赏
  • 举报
回复

#include<stdio.h>
/*
假设输出sum;

1.fun(a,3);传入a地址,即a[0]地址,*x=&a[0],n=3;

2.n!=0,执行return ( x[0]+fun(x+1,n-1) ),x[0]=a[0]=1.
再次调用fun(x+1,n-1);即调用fun(x+1,2);

此时sum=1+fun(x+1,2);

3.fun(a,2);传入a[1]地址,*x=&a[1],n=2;

4.n!=0,执行return ( x[0]+fun(x+1,n-1) ),x[0]=a[1]=2.
再次调用fun(x+1,n-1);即调用fun(x+1,1)

此时sum=1+2+fun(x+1,1);

5.fun(a,2);传入a[2]地址,*x=&a[2],n=1;

6.n!=0,执行return ( x[0]+fun(x+1,n-1) ),x[0]=a[2]=3.
再次调用fun(x+1,n-1);即调用fun(x+1,0)

此时sum+1+2+3+fum(x+1,0)

7.n==0,执行return (x[0]),x[0]=a[3]=4
此时sum=1+2+3+4=10;

*/
int fun(int *x,int n)
{
if(n==0)
{
printf("%d\n",&x[0]);
return (x[0]);
}
else
{
printf("%d\n",&x[0]);
return ( x[0]+fun(x+1,n-1) );
}
};

void main()
{
int a[]={1,2,3,4,5,6,7};

printf("%d\n",fun(a,3));
}




我觉得楼主犯了一个什么问题呢,就是每次都以为x[0]都是等于a[0]=1,其实不是的,你可以像我程序那加一个
printf("%d\n",&x[0]),看看地址一不一样,
注意下结贴率为0哦!!
14号选手 2012-05-06
  • 打赏
  • 举报
回复
你的意思是外面的x[0]是随着fun里面的x+1变化的,不断地向后移
这样理解正确吗?
[Quote=引用 2 楼 的回复:]

fun(a,3)
=a[0]+fun(&a[1],2)
=a[0]+a[1]+fun(&a[2],1)
=a[0]+a[1]+a[2]+fun(&a[3],0)
=a[0]+a[1]+a[2]+a[3]
=1+2+3+4
=10
[/Quote]
s_hhm 2012-05-06
  • 打赏
  • 举报
回复
靠,二三楼全说了,我说什么呢.
单步调试,一步一步的查看调用栈,看递归是如果压栈出栈的.

69,336

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧