c - 了解递归十进制到二进制代码?

标签 c recursion binary decimal

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

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

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

main 函数只是运行我给它的任何数字的函数,在本例中是 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;
}

最佳答案

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

关于c - 了解递归十进制到二进制代码?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33204772/

相关文章:

c - C 中的 Snake - 整数被更改但没有更改 - 有什么问题?

C Linux 跟踪所有函数调用,包括库中的函数

algorithm - 树路径长度的递归定义

javascript - 在javascript中跨域发布二进制数据

c - 了解 fork()、sleep() 和进程通量

c - 组装,画图

C++ “add explicit braces to avoid dangling else”

Javascript 用 setTimeout 递归循环数组?

java - 如何将java中的十六进制值发送到RS232串口

java - 我怎样才能得到位的位置