今天学习了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); } else return 1; } 2. int unsigned plus_(unsigned num) { if (num) { return num % 10 + plus_(num / 10); } else return 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个,然后往前推,这才是递归的本质。
如有不足之处,希望批评指正