嵌入式培训之C语言学习(十一)函数的递归调用与函数参数
1、直接递归:函数自己调用自己;2、间接递归:在其他函数中调用自己,然后自己再调用其他函数;3、递归是一种特殊的循环(第五种循环)以消耗大量内存空间为代价;4、递归思路:要求问题n,依赖于问题对n-1的解读;5、递归代码实现思路:递推关系;递推结束条件;6、注意事项:为保证栈区不被装满,要找到使循环停下来的条件(栈区空间消耗殆尽(每递归一次要保护现场后要恢复现场)程序崩溃)。7、扩:(笔试题)未定
一、函数的递归调用
1、直接递归:函数自己调用自己;
2、间接递归:在其他函数中调用自己,然后自己再调用其他函数;
3、递归是一种特殊的循环(第五种循环)以消耗大量内存空间为代价;
4、递归思路:要求问题n,依赖于问题对n-1的解读;
5、递归代码实现思路:递推关系;递推结束条件;
6、注意事项:为保证栈区不被装满,要找到使循环停下来的条件(栈区空间消耗殆尽(每递归一次要保护现场后要恢复现场)程序崩溃)。
7、扩:(笔试题)未定义其他变量不使用三大循环求1~100的和:

8、例题:(1)求n的阶乘;

(2)写出斐波那契的第n项并求前n项的和;

(3)汉诺塔(函数不崩溃是因为move函数不递归,最深层次递归63次栈区可容纳(有进有出),递归调用实现汉诺塔)

二、一维数组作为函数参数
1、一维整型数组做参数
形参——写成数组形式,还需要数组长度
实参——数组名,数组长度
2、一般形式写法:传参(数组首元素地址,数组元素个数)
printArray(int a[], int len)
编译器最终理解的形式为:
printArray(int *a, int len)
注:数组元素个数先在主函数中算出(在被调函数内部无法根据sizeof(a)计算出元素个数),(指针类型在32位为4字节,在64位为8字节)。
3、当使用数组作为参数传递时传递的是数组首元素地址,是指针传递,可在被调函数中修改主调函数;
4、例题:
(1)数组遍历输出;

(2)函数输出数组元素和与最大值;


(3)数组逆序输出;


(4)函数封装数组的三种排序与查找;
选择排序:

冒泡排序:

插入排序:

二分查找:


三、一维字符型数组作为函数参数
1、一维字符型数组做参数用来存放字符串
形参:数组形式
实参:数组名
2、注:因为处理的是字符串,字符串操作的时候不需要考虑数组长度,只需要关注结束标'\0';
3、封装函数实现一些字符串的常用操作:
(1)字符串函数封装遍历输出,小写转大写;

(2)字符串长度

(3)复制字符串

(4)拼接字符串;

(5)比较字符串大小;

(7)字符串逆序;

四、练习
1、编写程序实现void itoa(char s[], int n);实现整型转字符串;



输出结果:

2、编写程序实现int atoi(char s[]),实现字符串转整型;

输出结果:

更多推荐



所有评论(0)