2 回答
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 转八进制”(你提到的转二进制步骤太多,纸上推演的话太麻烦了)
如果你能成功推演,那么你就已经搞明白了这个递归是怎么回事。 如果不能再告诉我,我帮你推演。
TA贡献883条经验 获得超454个赞
如果你对此代码的疑惑是在“这个函数一直调用自己...”这里,那么你应该先去理解下什么是“递归”。
这个代码中“一直调用自己”的行为就是递归。下面那些语句当然不是没用的,它们会被执行到的。
当你明白了递归如何工作后,就能弄明白这段代码的行为。所以,先去理解下递归吧。
我之前曾经解释过关于递归的问题,你试着参考下,看看能不能明白递归的运作方式:http://www.imooc.com/qadetail/90499
- 2 回答
- 0 关注
- 1105 浏览
添加回答
举报