C语言关于递归的小问题

以下程序的输出结果是:?
void sub(int *a,int n,int k);
void main()
{
int x=0;
sub(&x,8,1);
printf("%d\n",x);
}
void sub(int *a,int n,int k)
{
if(k<=n)sub(a,n/2,2*k);
*a+=k;
}
正确的答案是:7
我想知道具体是怎么算的,尤其是递归的那部分,能帮我详细分析下吗?谢谢!

楼主的程序和楼上的回答有误。
这里用递归实现连乘,不需要全局变量保存什么信息,递归是用栈来实现语句和返回值的存放,详细原理建议楼主找一本C语言教程里面都有讲。
此外楼主main函数中对fact函数的声明以及fact函数的定义中需要加上参数类型声明。正确的代码如下:

#include

void main()
{
int i;
int fact(int); // 这里要有函数参数类型声明int
for(i=0;i<5;i++)
printf("\40:%d!=%d\n",i,fact(i));
}

int fact(int j)
{
int sum;
if(j==0)
sum=1;
else
sum=j*fact(j-1); // 函数递归调用
return sum;
}

问题补充:
int fact(int); // 这里要有函数参数类型声明int 但是下面我用的fact(i),而i已经定义为int 型,前面还是一定要先对参数进行定义么~?

在main中的int fact(int);语句是对fact函数进行声明,要声明的原因是编译器对代码编译的时候是从上到下进行扫描的,而fact函数的定义是在main函数之后,因此在main中调用fact(i)之前,必须先声明fact函数,也就是告诉编译器fact函数是个什么样子。
声明的时候必须指明函数的返回类型、函数名、函数参数及类型。因此int fact(int);是必要的。
如果fact函数的定义
int fact(int j)
{
int sum;
if(j==0)
sum=1;
else
sum=j*fact(j-1); // 函数递归调用
return sum;
}
是放在main函数之前的,那么main函数中调用fact(i)之前不需再进行声明,也就是int fact(i);语句可以不加。因为编译器编译到fact(i)调用时已经知道了fact函数的定义。

建议楼主对 变量的“声明”与“定义”、以及 函数的“声明”与“定义”这几个概念要区分一下。
温馨提示:内容为网友见解,仅供参考
第1个回答  2012-07-14
首先, sub函数里对*a的操作,都是对main函数中的x的操作.
第一次调用
x=0, n=8, k=1
k<=n成立,所以调用下一个sub(记住,此时的k=1)
{
x=0,n=4,k=2
k<=n成立, 所以调用下一个sub(记住,此时的k=2)
{
x=0,n=2,k=4
k<=n不成立, 所以不再递归
执行x+=k, 此时x=4
}
执行x+=k,(x=4, k=2), 之后x=6
}
执行x+=k,(x=6, k=1),之后x=7本回答被提问者和网友采纳
第2个回答  2012-07-14
递归貌似是对子函数的重复调用
第3个回答  2012-07-14
第4个回答  2012-07-14
00000
相似回答
大家正在搜