【C语言学习记录01】使用递归实现十进制转二进制

前言

我本人也在慢慢学习C语言,看的是C Primer Plus这本书,为了激励自己学习下去,所以会慢慢发分享一些学习心得,也当是记录一下吧,以后也好回顾回顾,本人很菜,高手们不要嘲笑,有问题欢迎指点或者交流,当然,我也可能不会......

正文

在C语言函数中使用递归往往能够极大的简便我们代码的复杂度,直接上代码,结合十进制转二进制代码来看更加方便。

#include <stdio.h>

void to_Binary(unsigned long u)
{
	int r;
	r = u % 2;
	if(u >= 2)
		to_Binary(u/2);
	putchar(r == 0 ? '0' : '1');
	return;
}
 
void main()
{
	unsigned long number;
	printf("please input a integer(q to quit) : \n");
	while(scanf("%ud",&number) == 1) 
	{
		printf("Binary equivalent :");
		to_Binary(number);
		putchar('\n');
		printf("please input a integer(q to quit) : \n");
	}
	printf("Done!\n");
	return 0;
	
}

这段代码是C Primer Plus的例子,我们使用了一个函数to_Binary(u),这个函数中嵌套了函数本身to_Binary(u/2),看上去像是一直“套娃”的感觉,这就是递归。

代码思路

先看main函数

定义一个无符号的long变量,后面进循环while,这个while触发的条件是只要你scanf的返回值是1,那么就会进入循环!那么scanf在什么情况下返回值是1呢,就是赋值功了,比如我们代码中赋值的地址是number的地址,number是个无符号的long变量,只要我输入的值是符合这个变量的要求的,就能赋值成功,那么就会进入循环,如果我们输入其他类型变量,比如字符,那么就不会进入循环,所以你输入q就会结束程序了!进入循环后,进入函数to_Binary(),得出结果,再次判断你接下来的输入是否符合无符号long变量的要求,从而决定是继续转二进制,还是结束程序。

下面看函数to_Binary

学过数字逻辑的同学们应该都知道如何用十进制求二进制吧,不断求除以2的余数.......这里不在赘述。仔细的看看代码也是这个思想。那么我们该怎么让这个结果连续的呈现出来呢?  这里可以用putchar,单字符输出。

递归就是只要这个十进制数二进制化还没到底(本身被除的只剩1),他就会一直进入新的阶层函数内,值得强调的是不同层次的函数内的变量虽然名字相同,但是他们本身的值是不一样的!例如:2(十进制) = 10(二进制),在这个代码中,number == 2,r = number % 2,即number == 0,也就是说第一层中,r == 0,此时if判断出number是>=2的,所以进入新的阶层的函数中去,在新的阶层中number == 1,新的阶层中r = number % 2,即r == 1,新的阶层中if判断出number是不符合>=2的条件的所以进入putchar,进行条件判断语句,这层的r == 1,所以输出了 '1',输出完成后,返回到上一阶层,完成上一阶层的putchar,上一层的r == 0,所以输出了 '0',所以输出就是10。

希望对大家有所帮助吧。

本文思路参考于C Primer Plus这本书,大家有兴趣可以去看看。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

super_Novaa

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值