理解递归十进制到二进制代码?

时间:2015-10-19 00:18:09

标签: c recursion binary decimal

我正在开发一个可以将数字转换为二进制形式的程序。

在帮助下,我能够得到它,它似乎工作,但我只是不明白如何。我想这样做的最好方法是尝试解释我认为这是如何工作的,有人可以纠正我。

我的函数有一个if语句,表示如果n除以2不等于0则将n除以2.然后如果n / 2则为1或0,则打印余数。

主函数只运行我给它的任何数字的函数,在本例中为456.

但程序如何知道多次运行该函数以获得整个二进制形式?

我觉得这并不复杂,但我没有得到它。

#include <stdio.h>

void ConvertToBinary(int n)
{
    if (n / 2 != 0) {
        ConvertToBinary(n / 2);
    }
    printf("%d", n % 2);
}

int main (){
    ConvertToBinary (456);
    return 0;
}

4 个答案:

答案 0 :(得分:3)

函数ConvertToBinary是递归的,意味着它自己调用。在某些时候,函数需要知道何时停止调用自身。这被称为基本情况。

在第一次调用此函数时,n = 456。在这种情况下n/2 != 0为真,所以函数调用自身,这次是228.它一直调用自己,直到它传递一个n/2 != 0为假的值,这是基本情况。对函数的最内部调用然后打印n % 2并返回。下一个最里面的调用也会打印n % 2的值为n,依此类推调用堆栈。

所以函数调用看起来像这样:

ConvertToBinary(456)
    ConvertToBinary(456/2=228)
        ConvertToBinary(228/2=114)
            ConvertToBinary(114/2=57)
                ConvertToBinary(57/2=28)
                    ConvertToBinary(28/2=14)
                        ConvertToBinary(14/2=7)
                            ConvertToBinary(7/2=3)
                                ConvertToBinary(3/2=1)
                                    print 1%2=1
                                print 3%2=1
                            print 7%2=1
                        print 14%2=0
                    print 28%2=0
                print 57%2=1
            print 114%2=0
        print 228%2=0
    print 456%2=0

结果:

111001000

答案 1 :(得分:1)

在一张横格纸上逐行浏览。在进行递归调用时使用缩进,然后在返回时取消。将输出放在纸张的右栏中。

我会从简单的数字开始,比如1,4,7,10,然后尝试456。

答案 2 :(得分:1)

这是我的第一个答案,但我会尽力解释。这是一个递归(谷歌)的例子,它是解决某些问题的有力工具。诀窍是该方法调用自身,因此跟踪它(用一个较小的例子):

第一次通话     n = 13     调用ConvertToBinary,13/2 = 6

第二次电话     n = 6;     调用ConvertToBinary,6/2 = 3

第三次电话     n = 3     调用ConvertToBinary与3/2 = 1

第四个电话     n = 1     1/2 = 0所以继续!     打印1%2 = 1     方法退出并返回第3个调用

再次第三次打电话     打印3%2 = 1     方法退出并返回第二个调用

再次打电话     打印6%2 = 0     方法退出并返回第一个调用

再次打电话     打印13%2 = 1     并完成了!

现在我们有1101,其中13是二进制,

答案 3 :(得分:0)

self.note?.attributedBody = NSAttributedString(attributedString: noteBody.textStorage!)