C语言-函数的递归和迭代
以下是我初学C语言的笔记记录,欢迎在评论区补充留言
一,函数的递归
大致有这么几个问题【我看完这堂课后,自己总结的几个问题】
* 问题
1,什么是函数的递归, 2,它是干什么用的,3,有什么条件吗,4,它与循环又有什么区别
* 回答
1,2:
是一个将重复性的问题,或是一个大的问题,给它精进成较小的问题,用较少的代码去解决;核心就是大事化小,有点像倒过来的金字塔,不断向下深究,从大到小慢慢解决
3:
有两个必要条件:第一,存在一个限定条件,当满足这个限定条件后,不再进行递归;第二,每次递归后越来越接近这个限定条件;
必须在编写函数的递归时候,要有这两个条件,有这两个递归条件不能保证不会死递归,但是没有他两,一定会死递归
4:
递归,你一再又再地跌入深谷【递】,直到跌到谷底【必要的条件】,你开始慢慢的向上攀爬回来【归】;循环,像是汽车在环形车道里绕圈,直到看到出口才会出去;前者是不断地往下递,在达到一个条件后,慢慢的归,后者是重复一个动作,直到满足一个条件后才停止这个动作
//函数的递归 //在不使用临时变量,计算字符串的大小 #include<stdio.h>int my_strlen(char* str) {if (*str != '\0') //必要的条件{return 1 + my_strlen(str + 1); //用到了函数的递归}elsereturn 0; } int main() {char str[] = "abcd";printf("%d", my_strlen(str)); //计算出str的大小return 0; }
思路:
首先,main函数中,调用了函数my_strlen(),并且传入实参 str 给到形参,由于数组传参是传递首个字符的地址,所以形参是一个指针变量
其次,根据,在my _strlen()函数中,根据形参给的地址,进行一个解引用操作,来进行判断是否为 '\0'(字符串的结束标志)的条件
困惑:为什么要用到 return 1 + my_strlen(str +1);
原因:由于第一个元素是a,所以字符串的大小至少是从 1 开始的,接着再用 str + 1,将现在的指针变量转向 b 的地址,再次进入这个函数,以此类推,到 \0 时候,发现 if 的条件不满足,进入到 else 中,返回 0 ,自此,“递”的动作做完,开始“归”,将刚刚没有执行完的返回值语句,一个个执行
二,函数的迭代
迭代包含循环,循环是一种特殊的迭代
【琐碎记录】
* %d 是打印有符号的整数,有正负数
* %u对应无符号,无负号
* 内存三个部分,栈区,堆区,静态区
* 函数的形参,局部变量,函数的调用都在栈区
* 死递归,栈溢出