递归调用的实例讲解
来源:互联网 发布:软件做成启动项 编辑:程序博客网 时间: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
- 递归调用的实例讲解
- 函数的递归调用实例
- PHP递归调用的小技巧讲解
- 递归算法实例讲解
- 递归算法实例讲解
- 递归算法实例讲解
- 递归算法实例讲解
- java中递归调用的实例
- 函数递归调用通俗讲解
- 递归调用实例
- shell 递归调用实例
- makefile递归调用实例
- 实例讲解JSP调用SQL Server的存储过程
- 实例讲解JSP调用SQL Server的存储过程
- Javascript setInterval的两种调用方法(实例讲解)
- 递归调用实例分析2.在函数中间的递归与在函数尾部的递归
- 数据结构基础 之 递归算法实例讲解
- 遍历 XML 文件所有节点的实例代码(递归调用)
- qiushi百科
- STM32F0xx_USART收发配置详细过程
- 二维数组传递参数
- 求N个数的最小公倍数
- 顺序表应用6:有序顺序表查询
- 递归调用的实例讲解
- 递归调用实例分析2.在函数中间的递归与在函数尾部的递归
- c语言不定参数与printf函数的实现
- C语言实现数组的奇偶排序
- 一个数组中所有的数都是成对出现的只有一个或者两个数字是单独的,求这个数
- C语言中模拟实现strcpy,strstr,strcat函数
- C语言模拟实现memcpy,memmove函数
- C语言中的指针与数组的关联1
- C语言中指针与函数的关联2(数组的降级)