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)的一部分。

希望这能帮助