递归函数是否反向输出?十进制转二进制递归函数输出疑问
解答:递归函数的执行顺序与十进制转二进制的逻辑
首先,你提到的递归函数之所以输出1010而不是你预期的顺序,核心原因是递归调用的执行顺序是「先深入、后回溯」,cout语句是在递归调用之后执行的,所以输出顺序是从二进制的高位到低位,而不是反过来。
咱们拿n=10的情况一步步拆解执行流程:
- 调用
convertToBinary(10):因为10>0,先执行convertToBinary(10/2)也就是convertToBinary(5),此时cout << 10%2(结果是0)这个语句被暂停,不会立刻执行。 - 进入
convertToBinary(5):5>0,先执行convertToBinary(5/2)也就是convertToBinary(2),cout <<5%2(结果是1)同样被暂停。 - 进入
convertToBinary(2):2>0,先执行convertToBinary(2/2)也就是convertToBinary(1),cout <<2%2(结果是0)暂停。 - 进入
convertToBinary(1):1>0,先执行convertToBinary(1/2)也就是convertToBinary(0),cout <<1%2(结果是1)暂停。 - 进入
convertToBinary(0):因为0不满足n>0的条件,函数直接返回,没有任何输出。
现在开始回溯执行暂停的cout语句:
- 回到
convertToBinary(1),执行暂停的cout <<1%2,输出1。 - 回到
convertToBinary(2),执行暂停的cout <<2%2,输出0。 - 回到
convertToBinary(5),执行暂停的cout <<5%2,输出1。 - 回到
convertToBinary(10),执行暂停的cout <<10%2,输出0。
把这些输出连起来就是1010,这正是10的正确二进制表示,你的预期101是错误的——10的二进制就是4位,不存在所谓的前导省略问题哦。
关于你问的「递归函数是否会反向输出」:可以理解为这个递归的逻辑就是利用回溯实现了反向输出。如果把cout语句放在递归调用之前,那才会从低位到高位输出(比如先输出0,再输出1,再输出0,再输出1,得到0101),但那样的结果是错误的,因为二进制的高位应该在左侧。
另外补充一点:如果输入n=0,当前函数不会输出任何内容,你可以在main里加个判断,比如如果n=0就直接输出0,这样函数的鲁棒性会更好。
内容的提问来源于stack exchange,提问作者Joe Cole
相关产品推荐
相关产品推荐

