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

C 理解从十进制到二进制的递归代码?,c,recursion,binary,decimal,C,Recursion,Binary,Decimal,我正在开发一个程序,可以将数字转换成二进制形式 在帮助下,我能够得到这个,它似乎起作用,但我只是不明白如何。我想最好的办法是解释一下我认为这是如何起作用的,有人可以纠正我 我有一个函数,它有一个if语句,如果n除以2不等于0,那么就把n除以2。然后,如果n/2,则打印余数,因此为1或0 主函数只是使用我给它的任何数字来运行函数,在本例中是456 但是程序如何知道多次运行函数以获得整个二进制形式呢 我觉得这没那么复杂,但我不明白 #include <stdio.h> void Con

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

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


我有一个函数,它有一个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;
}
#包括
void ConvertToBinary(int n)
{
如果(n/2!=0){
ConvertToBinary(n/2);
}
printf(“%d”,n%2);
}
int main(){
ConvertToBinary(456);
返回0;
}

在一张衬纸上一行一行地浏览它。在进行递归调用时使用缩进,然后在返回时取消缩进。将输出放在论文的右栏


我会从简单的数字开始,比如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;
}
我会从简单的数字开始,比如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;
}
void ConvertToBinary(int n) { //输入的数字是否为2或更大?如果是,请先打印较小的二进制数字。 如果(n/2!=0){ //这是一个递归调用。在打印所有较小的二进制数字之前,它不会返回。 ConvertToBinary(n/2); } //所有较小的数字都已打印出来,是时候打印出当前的二进制数字了。 printf(“%d”,n%2); } int main(){ ConvertToBinary(456); 返回0; }
#包括
void ConvertToBinary(int n)
{
//输入的数字是否为2或更大?如果是,请先打印较小的二进制数字。
如果(n/2!=0){
//这是一个递归调用。在打印所有较小的二进制数字之前,它不会返回。
ConvertToBinary(n/2);
}
//所有较小的数字都已打印出来,是时候打印出当前的二进制数字了。
printf(“%d”,n%2);
}
int main(){
ConvertToBinary(456);
返回0;
}

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

第一次调用此函数时,n=456。在这种情况下,
n/2!=0
为true,因此函数调用自身,这次使用228。它不断地调用自己,直到传递一个值,其中
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

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

第一次调用此函数时,n=456。在这种情况下,
n/2!=0
为true,因此函数调用自身,这次使用228。它不断地调用自己,直到传递一个值,其中
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 使用13/2=6调用ConvertToBinary

第二次呼叫 n=6; 使用6/2=3调用ConvertToBinary

第三次呼叫 n=3 使用3/2=1调用ConvertToBinary

第四次呼叫 n=1 1/2=0,继续! 打印1%2=1 方法退出并返回到第三个调用

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

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

第一次再打 打印13%2=1 完成了


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

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

第一次呼叫 n=13 使用13/2=6调用ConvertToBinary

第二次呼叫 n=6; 使用6/2=3调用ConvertToBinary

第三次呼叫 n=3 使用3/2=1调用ConvertToBinary

第四次呼叫 n=1 1/2=0,继续! 打印1%2=1 方法退出并返回到第三个调用

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

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

第一次再打 打印13%2=1 完成了


现在我们有1101,它是13的二进制形式,

我投票结束这个问题,因为堆栈溢出不是代码复查或教程站点。“然后如果n/2,它将打印剩余的,所以是1或0”或者
-1
如果
n_original<0
。我投票将此问题作为主题外的问题结束,因为堆栈溢出不是代码复查或教程站点。“如果n/2,则打印剩余部分,因此为1或0”或
-