理解递归十进制到二进制代码?
我正在研究一个可以将数字转换为二进制形式的程序。理解递归十进制到二进制代码?
有了帮助,我能够得到这个,它似乎工作,但我只是不明白如何。我想最好的办法是试图解释我认为这是如何工作的,有人可以纠正我。
我有一个具有一个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;
}
在一张横格纸上逐行扫描。当您进行递归调用时使用缩进,然后在您返回时进行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;
}
功能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,
我投票,因为堆栈溢出是没有代码审查或教程网站关闭这一问题作为题外话。 – Olaf
“然后,如果n/2为1或0,则打印余数”或如果为n_original chux