printbinary递归算法
printbinary recursive algorithm
本文关键字:递归算法 printbinary 更新时间:2023-10-16
我无法理解这个简单的递归函数是如何工作的:
void printBinary(const int& n)
{
if(n < 2)
{
cout << n;
}
else
{
printBinary(n / 2);
printBinary(n % 2);
}
}
我知道这与n/2"砍掉"二进制表示的最后一位和n/2产生二进制表示的这最后一位有关,但当我递归地跟踪这个代码时,这似乎很神奇。我想不出一个简单的合乎逻辑的解释。
编辑:这是对算法的一个很好的解释,让我把我的问题改写为:为什么n%2,或十进制数的余数,会给你这样一个数字的二进制数字。这背后的逻辑是什么?
对于递归算法,我总是发现在带有缩进的文本文件中快速写出一个小示例来显示递归级别是很有帮助的:
f(42)
f(21)
f(10)
f(5)
f(2)
f(1) - 1
f(0) - 0
f(1) - 1
f(0) - 0
f(1) - 1
f(0) - 0
这是一个等价的二进制树,可能会有所帮助:
f(101010b)
f(10101b)
f(1010b)
f(101b)
f(10b)
f(1b) - 1
f(0b) - 0
f(1b) - 1
f(0b) - 0
f(1b) - 1
f(0b) - 0
你会从中看到,第一个递归调用(n/2)将一直除以2,直到它找到最高有效位,它递归的次数就是答案中的位数。在得到1或0之前,你能把42除以2多少次?6次,所以答案中总共有6个比特。
下一步就不那么明显了。当你深入到倒数第二个级别f(2)或f(10b)时,你所做的就是识别两个最有效的数字。看看一个可能不那么令人困惑的十进制值。
f(1234)
f(123)
f(12)
f(1) - 1
f(2) - 2
f(3) - 3
f(4) - 4
当你一直除以10时,你总是有一些最有效的数字。当你到达最后两位(12)时,第一位是12/10,第二位是12%10。回到一个级别,(123),你已经递归地处理了前两个最sig的数字,f(12),现在你运行f(3),在十进制的情况下,它将是基本情况(n<10)的一部分。
希望这能帮助
相关文章:
- 需要为 C++ 中的以下问题设计递归算法
- 这种用于查找连续子数组中最大和的递归算法有什么优势吗?
- 运行合并排序递归算法时EXC_BAD_ACCESS错误
- 如何改进搜索二项式系数的递归算法
- 如何转换多次调用自己的递归算法?
- 如何将字符串保存在最长的常见子序列递归算法中
- 编写递归算法以从链表中删除元素.编写递归算法以将元素添加到链表中
- 指针似乎迷失在递归算法中
- 如何从递归算法返回节点
- 从递归算法到迭代算法
- 可传递值影响递归算法的渐近时间复杂性
- 我的递归算法中的问题,用于查找所有最短、唯一的路径
- 带有两个递归调用的递归算法的时间复杂性
- 这种递归算法有什么问题?
- C++递归算法中抛出异常
- 将条件递归算法转换为迭代算法
- 递归算法中的分段错误
- printbinary递归算法
- 迭代等价于递归算法
- O(n^m) 复杂度的递归算法