C语言函数递归调用问题? 10

代码如下,题目是用递归的方法写一个计算输入数字各位之和的函数,请问这段代码的问题出在了哪?#include<stdio.h>#include<math.h>intsum=... 代码如下,题目是用递归的方法写一个计算输入数字各位之和的函数,请问这段代码的问题出在了哪?
#include <stdio.h>
#include <math.h>

int sum=0;

int add(int x)
{
int j=0,k=0;
int a[1000];
for (j=0;j<1000;j++) //统计输入数的位数
{
if (x<pow(10,j))
break;
}
k=x/pow(10,j);
x=x-(k*pow(10,j));
sum+=k;
if(x>10)
{
add(x);
}
else
{
return sum;
}
}

int main()
{
int num;
scanf("%d",&num);
sum=add(num);
printf("%d",sum);
return 0;
}
展开
 我来答
謇痴弥骏琛
2020-04-30 · TA获得超过3825个赞
知道大有可为答主
回答量:3071
采纳率:34%
帮助的人:163万
展开全部
函数其实没有释放内存的概念,因为函数都是在指令区,而不是通常所说的释放内存对应的数据区,不过在整个程序执行完之后指令区也是要释放的。
函数调用的大概过程如下:
1,将调用函数的上下文入栈;
2,调用被调用函数;
3,被调换函数执行;
4,调用函数上下文出栈,继续执行后继指令。
所以在函数调用过程中原调用函数是不会退出的-----即你所说的释放内存。
具体到你给的代码:
首先main中调用test,
进入test后要求读入一个char,
你输入'1'后执行case
'1'中语句,所以输出“已调用”,然后就执行test()语句,即递归调用,此时main调用的test要等新的test执行完毕才能继续执行后继的i++语句;
再次进入test之后与从main中进入时一样,如果输入的是'1'会接着递归调用test,由于你输入了5次1,所以会继续调用5次test;
在最后一个test中你输入了ESC?
所以不再走case
'1'而走default了,所以输出"222222";
switch执行完之后判断c==27满足,所以while循环退出,继续执行printf语句,由于之前的test统统没有执行过case
1里的i++语句,所以全局变量i还是0;输出i=0;
到此最后一次test执行完毕;
倒数第二次的test继续执行i++,
所以i=2了,case
1执行完毕,但由于没有写break语句,所以继续执行default
语句,输出"222222",
退出switch语句,判断c==27,
由于c是全局变量,且最后一次输入的刚好是ESC,
所以判断满足,
退出while循环,输出i=1,
到此倒数第二次test执行完毕;
与倒数第二次类似的继续执行倒数第三、倒数第四、倒数第五和最终的第一次test后继代码,也就输出如你列出的结果了。
匿名用户
2020-04-23
展开全部

你也太强行递归了。。。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2020-04-23
展开全部
学着去调试程序,循环时把变量x,k,sum都打印出来,第一遍循环就能发现问题了。
这种题先学着怎么把数字中每一位提取出来,12%10=?
下面程序来源于网络,供学习借鉴
#include <stdio.h>
int main()
{
int n,sum=0;
while(scanf("%d",&n)!=EOF){
sum=0;
while(n!=0)
{
sum+=n%10;
n=n/10;
}
printf("%d\n",sum);
}
return 0;
}
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(1)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式