C语言 -- 递归学习

来源:互联网 发布:手机网络相关参数含义 编辑:程序博客网 时间:2024/04/30 11:46

    之前一直都没有怎么理解递归,近来学校校企合作,教 C语言,我也正好复习一下 C,或者说有的地方还要学习一下,大一的时候实在是懵懂无知,混着混着 C就学完了,学完之后的那感觉就是:啥都不会啊!直到大二学面向对象 C++才有点了解了,可是却分不太开 C C++。言归正传,说递归。

/* 1.不用递归实现的*/#include <stdio.h>int main(){unsigned long  num = 0;printf("\n输入一个整数 :");scanf("%lu",&num);//输入,注意 %luprintf("逆向输出     : ");unsigned long  tmp  = num;while( tmp != 0)//当上一次除以10结果为一位数时结束循环{printf("%lu",tmp%10);//输出下一位tmp = tmp / 10 ;}printf("\n");return 0;}/* 1.用递归实现*/#include <stdio.h>//b_2_ascii 函数式看一篇博客里详解递归的例子。int b_2_ascii( unsigned int value ){unsigned int quotient;quotient = value / 10;if( quotient != 0)b_2_ascii( quotient);putchar( value % 10 + '0');return 0;}  void rec(unsigned int n){unsigned int value = n ;printf( "%lu", value % 10 );value = n / 10;if( value%10 != 0)rec( value );return ;}int main(){unsigned long num;printf( "Input Number: ");scanf( "%lu", &num);rec( num);b_2_ascii( num);return 0;}



    首先不用递归实现逆序输出,自然就想到除以10,对 10 取余,如:123 %10 = 3 ; 123 / 10 = 12 , 12 % 10 = 2 ; 12 / 10 = 1,1 % 10 =1 .( 应该是:123 %10 = 3, 123 / 10 = 12; 12 % 10 = 2 , 12 / 10 = 1;1 % 10 =1 , 1 / 10 = 1. ,这样写出来就比较统一,而不是像我之前,先输出了3,再用一个循环输出后面的。)
     我实在是太愧为大三的了,竟然都不知道递归怎么实现,于是百度。看见一篇博客递归算法详细分析-> C,分析的很不错,递归的实现是栈,栈是先进后出。于是可以“帮助我们以正确的顺序打印这些字符”,不过与我所做的题要求逆序输出不同的是,该博客的博主举得例子是需要正序输出,因为按照对 10 求余,再除以 10的方法得出的刚好是逆序,所以博主用递归实现逆序输出,即 所谓的先进后出。
    但是,我要实现的还是正序输出。直到刚才我才想出点解释(所以写博客是很有必要的)。栈虽然是先进后出,但是对栈中的数据的操作却有两个机会,(虽然我数据结构学得不怎么样,但也知道数据只有在栈顶时才可以操作)
    1. 进栈时在栈顶时。
    2.出栈时在栈顶时。
    如果在进栈停在栈顶时(被往栈底推入之前)提取数据进行输出,那么就还是正序。如果,在出栈时取出输出,那么就是逆序输出。
再说说我写时的错误:
首先,递归已经可以说是构成了循环,而傻 X 的我居然还写个 while ( value % 10 != 0) 。
另外,就是if 里面的迫近条件的选择。

    最后说下之前说的那片博客里的一个错误。就是里面有句话:“使用字符常量而不是整型常量可以提高程序的可移植性”,我当时就粘了贴在QQ 空间,后来有同学问为什么,我于是百度、谷歌相关关键词,最后发现原来是使用符号常量可以提高程序的可移植性”。符号常量 跟 字符常量是不同的,想是博主记错了。符号常量例子:
#define PI 3.1415926
而博主说的字符常量 是 'a' 等等。至于使用符号常量为什么能提高程序的可移植性,却还不是太清楚,我的理解就是,修改方便,换到不同平台下面的时候只需要修改一处即可。
    不过此事又再次提醒我不要不加考证就相信别人所说。


原创粉丝点击