为了账号安全,请及时绑定邮箱和手机立即绑定

进制转换函数没有看懂

进制转换函数没有看懂

C
qq_superman_24 2018-06-14 20:35:23
#include <stdio.h>#include <string.h>void change(char *s,int n,int b);int main(){ int num,base; char s[100]; printf("请输入一个数:\n"); scanf("%d",&num); printf("请输入要转换的进制\n"); scanf("%d",&base);    change(s,num,base); printf("%d转换成%d进制为:%s\n",num,base,s); return 0;}void change(char *s,int n,int b){ char bit[]={"0123456789ABCDEF"}; int len;  if(n==0)    {     strcpy(s,"");     return;      } change(s,n/b,b);   这个函数一直调用自己,最后n=0了,s中保存的内容不就是空的直接返回了吗?下面的语句不就没用了。 len=strlen(s); s[len]=bit[n%b]; s[len+1]='\0'; }
查看完整描述

2 回答

已采纳
?
onemoo

TA贡献883条经验 获得超454个赞

“阶乘问题中不断递归得出结果即可,而这个问题...” 从这句话来看,你可能也并没有真正理解那个阶乘的递归过程。因为这两个代码逻辑都是“递归”,并没有本质的区别。


为什么你会觉得“后面的语句不会执行”呢? 这或许说明,你可能没搞清楚函数的执行流程(不仅指递归函数)。


我帮你整理下思路,你试着分析下这个 change 函数的执行流程:

你疑惑的那三条语句存在于函数中,前面也没有必然的 return 语句跳过它们,为什么不会被执行呢!

哦,前面是有个 return,但那是在 if 中,也就是只有当参数 n 为 0 时才会执行那个 return。那么当参数 n 不为 0 时,if 后面的语句都会被依序执行的。你仔细想想代码的执行流程,是不是这样?

if 语句后面的语句具体来说有 4 条:

change函数调用

len=strlen(s);

s[len]=bit[n%b];

s[len+1]='\0';

不要被又调用了 change 搞乱思路。从函数执行流程上来说,这只不过是调用了一个函数而已,和调用别的什么函数没有区别!  注意:我们这里只分析代码的执行流程。如果 change 这个名字会引起你的混乱,那么我们暂称它为“abc函数”好了。

那么最基础的知识:当abc函数调用执行结束之后,该执行哪个语句?  当然是abc函数调用语句后面的语句了!  所以,当 change 函数调用结束后,len = strlen(s);... 这三条语句都会依次执行的。

好了,到这里,你是否理清了 change 的具体执行流程呢? 只是说执行流程,先别管每一次的执行结果。


如果你明白了执行流程,那么你可以用简单的例子,在纸上推演下在上述流程中的每一步都发生了什么。比如“15 转八进制”(你提到的转二进制步骤太多,纸上推演的话太麻烦了)

如果你能成功推演,那么你就已经搞明白了这个递归是怎么回事。 如果不能再告诉我,我帮你推演。

查看完整回答
反对 回复 2018-06-16
?
onemoo

TA贡献883条经验 获得超454个赞

如果你对此代码的疑惑是在“这个函数一直调用自己...”这里,那么你应该先去理解下什么是“递归”。


这个代码中“一直调用自己”的行为就是递归。下面那些语句当然不是没用的,它们会被执行到的。

当你明白了递归如何工作后,就能弄明白这段代码的行为。所以,先去理解下递归吧。


我之前曾经解释过关于递归的问题,你试着参考下,看看能不能明白递归的运作方式:http://www.imooc.com/qadetail/90499

查看完整回答
反对 回复 2018-06-15
  • qq_superman_24
    qq_superman_24
    非常感谢。我知道是递归,也能懂你发的这个阶乘问题。但是这个问题还涉及到其他放面我还是没懂,阶乘问题中不断递归得出结果即可,而这个问题它递归它的每一层结果是怎样的(比如我输入数字15要求转换为2进制),递归完后,s数组中不还是保存了一串空字符吗,返回后后面的语句为什么会执行呢?
  • onemoo
    onemoo
    你真的搞懂了那个阶乘的递归吗?我表示怀疑... 好吧,想写得太多,我另写了一个回答。 总之,我想继续引导你思考,而不是直接给你详细的解答。
  • 2 回答
  • 0 关注
  • 1069 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信