前言
我本人也在慢慢学习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这本书,大家有兴趣可以去看看。