C语言新手,写的一个简单的递归,不能终止了啊。。。

#include<stdio.h>
void fun (int);
int main (void)
{
int n;
while(scanf("%d",&n)!=EOF&&n)
{
fun(n);
}
return 0;
}
void fun (int n)
{
static int sum=0;
sum+=n%10;
if(!(n/10))
printf("%d",sum);
fun(n/10);
}

目的是计算输入数字各位的和

递归函数一定要有至少一个肯定能返回的出口,这很重要,否则会无限循环嵌套,一直到栈溢出。修改如下:
void fun (int n)
{
static int sum=0;
sum+=n%10;
if(!(n/10))
printf("%d",sum);
else fun(n/10); //这里加上了一个else,目的是说n/10为零时,就打印printf,不再递归调用fun,这样过了这次调用,递归开始逐级返回。n/10总会有为零的时候,所以这样才能保证我前面所说的出口。
}追问

恩,我改成这样,
#include
int fun (int,int);
int main (void)
{
int n,i;
while(scanf("%d",&n)!=EOF&&n)
{
i=fun(n,0);
printf("%d",i);
}
return 0;
}
int fun (int n,int sum)
{
sum+=n%10;
if(!(n/10)){
printf("%d\n",sum);return sum;}
fun(n/10,sum);
}
怎么main 里面打印的i的值和fun里sum的不一样啊

追答

因为return sum是最里层的fun返回的,它没有给任何变量保存,拆解一下:
int fun (int n,int sum) //假设这是倒数第二次递归调用
{
sum+=n%10;
if(!(n/10)){
printf("%d\n",sum);return sum;}
fun(n/10,sum); => int fun (int n,int sum) //这是最后一次递归调用,最后一次调用会返回sum但是fun没有给任何变量
{
sum+=n%10;
if(!(n/10)){
printf("%d\n",sum);return sum;} //最后一次在这里返回
fun(n/10,sum);
}
//这里是倒数第二次调用的返回,你没有返回任何数。
}
//这之后再继续返回,和倒数第二次的返回一样,直到返回到首次调用i=fun(n,0);
fun没有返回任何数。
如果你不想改函数内容,可以这样做:
#include
int fun (int,int);
int main (void)
{
int n,i;
while(scanf("%d",&n)!=EOF&&n)
{
i=0;
fun(n,i);
printf("%d",i);
}
return 0;
}
int fun (int n,int& sum)//这里的意思是把i的地址往这里传,函数里对sum的修改就是对i的修改,所以不用返回任何值,计算的sum已经给了i
{
sum+=n%10;
if(!(n/10)){
printf("%d\n",sum);return sum;}
fun(n/10,sum);
}
不用管return了

温馨提示:内容为网友见解,仅供参考
第1个回答  2011-10-21
void fun (int n)
{
static int sum=0;
sum+=n%10;
if(!(n/10))
{printf("%d",sum);
fun(n/10);}
}
注意递归的出口 这样简单该一下将打出多个SUM依次从后向前累加的和 打印一个定义全局变量
第2个回答  2011-10-21
void fun (int n)
{
static int sum=0;
sum+=n%10;
if(!(n/10))
{ printf("%d",sum);return;} //少了句结束符
fun(n/10);
}
第3个回答  2011-10-21
#include<stdio.h>
void fun(int);
int sum = 0;

int main()
{
int n;
if(scanf("%d", &n) && n >= 0)
{
fun(n);
printf("%d\n", sum);
}
else
printf("Error!\n");
return 0;
}

void fun (int n)
{
sum += n % 10;
if(n/10)
fun(n /= 10);
}
相似回答