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

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

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

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

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

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

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

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

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

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

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

 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,4,7,10,然后尝试456。

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

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

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

第3次调用n = 3调用ConvertToBinary,其中3/2 = 1

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

再次打3次打印3%2 = 1方法退出并返回第2次调用

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

第一次打电话打印13%2 = 1完成!

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

 #include  void ConvertToBinary(int n) { // is the number passed in 2 or greater? If so, print out the smaller binary digits first. if (n / 2 != 0) { // this is a recursive call. It won't return until all the smaller binary digits have been printed. ConvertToBinary(n / 2); } // all the smaller digits have been printed, time to print out the current binary digit. printf("%d", n % 2); } int main (){ ConvertToBinary (456); return 0; }