【问题标题】:printbinary recursive algorithmprintbinary递归算法
【发布时间】:2015-04-23 13:26:05
【问题描述】:

我无法理解这个简单的递归函数是如何工作的:

void printBinary(const int& n)
{
    if(n < 2)
    {
        cout << n;
    }
    else
    {
        printBinary(n / 2);
        printBinary(n % 2);
    }
}

我知道这与 n / 2 “砍掉”二进制表示的最后一位数字和 n % 2 产生二进制表示的最后一位数字有关,但是当我递归跟踪这段代码时,它看起来就像魔术.我想不出一个简单的合乎逻辑的解释。

编辑: This 是对该算法的一个很好的解释,并让我将我的问题重新表述为:为什么 n % 2 或十进制数的余数会为您提供此类数字的二进制数字。这背后的逻辑是什么?

【问题讨论】:

  • 你明白为什么n % 10给你最后一个以10为底的数字吗?那么n % 2在base 2中是一样的。
  • 好的,所以它适用于所有基础......我想这只是你必须把它当作事实而不问为什么余数是二进制表示中的数字?
  • 这是因为数字是 a0 + 2*a1 + 4*a2 + 8*a3 + ... 其中 a0,a1,... 是从右到左的二进制数字。如果您将商和余数除以 2,您将分别得到 a1 + 2*a2 + 4*a3 + ...a0
  • 有道理,伙计。它基本上是由于系统的定义,每个位置如何是 2 的幂。我希望我可以将此标记为答案...谢谢!

标签: c++ algorithm recursion binary


【解决方案1】:

对于递归算法,我总是发现在文本文件中快速写出一个小示例很有帮助,并带有缩进以显示递归级别:

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 除以多少次? 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

希望对你有帮助

【讨论】:

    猜你喜欢
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-03
    • 1970-01-01
    • 1970-01-01
    • 2014-08-29
    相关资源
    最近更新 更多