猿问

进制转换函数没有看懂

#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';
}

qq_superman_24
浏览 1106回答 2
2回答

onemoo

“阶乘问题中不断递归得出结果即可,而这个问题...” 从这句话来看,你可能也并没有真正理解那个阶乘的递归过程。因为这两个代码逻辑都是“递归”,并没有本质的区别。为什么你会觉得“后面的语句不会执行”呢? 这或许说明,你可能没搞清楚函数的执行流程(不仅指递归函数)。我帮你整理下思路,你试着分析下这个 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 转八进制”(你提到的转二进制步骤太多,纸上推演的话太麻烦了)如果你能成功推演,那么你就已经搞明白了这个递归是怎么回事。 如果不能再告诉我,我帮你推演。

onemoo

如果你对此代码的疑惑是在“这个函数一直调用自己...”这里,那么你应该先去理解下什么是“递归”。这个代码中“一直调用自己”的行为就是递归。下面那些语句当然不是没用的,它们会被执行到的。当你明白了递归如何工作后,就能弄明白这段代码的行为。所以,先去理解下递归吧。我之前曾经解释过关于递归的问题,你试着参考下,看看能不能明白递归的运作方式:http://www.imooc.com/qadetail/90499
随时随地看视频慕课网APP
我要回答