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

问题描述:

我正在研究一个可以将数字转换为二进制形式的程序。理解递归十进制到二进制代码?

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

我有一个具有一个if语句,说如果n除以2的功能是不等于0,则除以2 N,则它将打印余量如果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; 
} 
+1

我投票,因为堆栈溢出是没有代码审查或教程网站关闭这一问题作为题外话。 – Olaf

+0

“然后,如果n/2为1或0,则打印余数”或如果为n_original chux

在一张横格纸上逐行扫描。当您进行递归调用时使用缩进,然后在您返回时进行unindent。将输出放在纸张的右栏中。

我会用简单的数字开始像1,4,7,10,然后尝试456

#include <stdio.h> 

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; 
} 
+0

详细信息:“是2或更大的数字?”真的应该是“是2或更大的数字的绝对值?”因为'n'可能有负值。 – chux

+0

程序不能使用负值。什么是-5%2? – Darren

+0

该函数将与“ConvertToBinary(-5)'产生输出”-10-1“一起”工作“,当然不是所希望的。 '-5%2' - >'-1'。 – chux

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

第一次调用此函数时,n = 456。在这种情况下,n/2 != 0为真,所以函数自己调用自己,这次调用自己,它自己调用自己,直到它传递一个值,其中n/2 != 0是false,这是基本情况。对函数的最里面的调用然后打印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 

这是我在这里的第一个答案,但我会试着解释,尽我所能。这是一个递归的例子(谷歌),它是解决某些类型问题的强大工具。诀窍是,该方法调用自身,所以跟踪它通过(具有更小的示例):

第一呼叫 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%2 = 1 方法退出,并返回到第二呼叫

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

再次拨打第一个电话 打印13%2 = 1 并完成!

现在我们有1101的二进制为13,