递归调用的实例讲解

来源:互联网 发布:软件做成启动项 编辑:程序博客网 时间:2024/05/19 02:06
今天学习了C语言的递归调用,跟大家分享下心得例一:编写一个函数实现n^k,使用递归实现我第一次编写的代码如下(其实是抄的)
int my_pow(int n, int k)     {int sum;if (k == 0){sum = 1;}else{sum = n*my_pow(n, k - 1);}return sum;}


    然后我仔细研究发现,可以不需要else语句,用if语句可以更简洁的写出以下代码,修改后如下:

int my_pow(int n, int k)     {int sum=1;if (k)//千万不能用while{sum = n*my_pow(n, k - 1);}return sum;}

    直接把sum初始化为1,当k=0时跳出循环返回1,然后从里到外层层返回,值得注意的是,这样的代码是不能够用while循环的,这样会造成死循环,因为while是循环语句,if是判断语句,入栈的时候k的值会改变,会影响到while的循环次数,这样周而复始= =。害得朕调试了许久。。。


例二:写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

    有了上边的经验,这就简单了许多一气呵成,其实写起来还真不是那么回事,我一般是先写在修改

第一次是这样的

int unsigned plus_(unsigned num){int sum=0;if (num<10){sum = num;}else if((num/10)> 0){sum = num % 10 + plus_(num / 10);}return sum;}

    然而洗了个头回来看,我有病啊!!!因为第一个是抄的,然后惯性思路既用了num/10判定条件,然后搞得头一位必许单独输出,修改如下:

int unsigned plus_(unsigned num){int sum=0;    if(num){sum = num % 10 + plus_(num / 10);}return sum;}    之后被分析,说这样并没有体现出递归的限制条件,自己想想也对于是就改为:    1.    int my_pow(int n, int k)     {if (k){return n*my_pow(n, k - 1);}elsereturn 1;}    2.    int unsigned plus_(unsigned num){if (num){return num % 10 + plus_(num / 10);}elsereturn 0;}

例三:

编写一个函数reverse_string(char * string)(递归实现)实现:将参数字符串中的字符反向排列。

要求:不能使用C函数库中的字符串操作函数。

    这个函数实现主要分为两部分,因为不能调用库函数,所以要用长度计数器,然后再用递归实现翻转

    如下

char* reverse_string(char * p){assert(p);int n = 0;char temp;char *q;q = p;while (*p != '\0')//模拟实现strlen函数{n++;p++;}if (n > 1){temp = q[0];q[0] = q[n - 1];q[n - 1] = '\0';reverse_string(q + 1);q[n - 1] = temp;}return q;}

    经过自己的研究,意识到递归必须对函数本身有限制,最好用if,用while可能会造成死循环。其他的就是递归调用本就是函数调用其本身。用从最内层调用想起,比如一个猴子一天班一个玉米,50个玉米要用几天搬完,我们就要这样想,当他还剩一个搬完时已经搬了49个,然后往前推,这才是递归的本质。

如有不足之处,希望批评指正

本文出自 “pawnsir的IT之路” 博客,请务必保留此出处http://10743407.blog.51cto.com/10733407/1710725

0 0
原创粉丝点击