- 什么是递归算法
高级数据结构,举个例函数自己调用自己叫递归
main函数自己调用自己
死递归,
死循环,跑着跑着关了,跑死了
最简单的递归,是不能这样写,但是可以
最重要思想:把大事化小
- 例子1:
1234%10得到各位
1234/10=123%10=3
123/10= 12%10 =2
12/10=1 1%10 = 1
先模10再除10
递归的写法:
unsigned int main = 0;
print函数可以打印参数部分数字的每一位
以大化小
注意要大于九这是隐含条件
自定义函数
if(n>9)
{
print(n/10);
}
这里面才是最底层的关键
这个自定义函数是最难理解的,要对她扣息
我们把她分解成多份
五行代码却完成如此多的步骤
把大事化小
自己调用自己
要画图表示出来
递归在书写的时候很重要
递归的书写很重要
递归可以听下来
if(n>9)很重要
递归有进入和跳出条件 - 递归的两个必要条件
if(n>9)
133>>13>>1
这是必要条件
易错递归
满足两个条件
但是这个代码挂了
出现了栈溢出stack overflow
举例子:内存使用时
有三个区域叫栈区 堆区 静态区
每一个函数调用都要在内存栈区给自己分配一个空间
调用main函数,有块main函数的栈帧空间
这个栈帧空间,放给别的空间
另一块区域给test分配
teat内存发现又要调用test
又有一个test函数的空间
栈区空间的被耗干,会出现栈溢出
所以在写递归的时候
1.决不能死递归,就不会跳出条件,每次递归逼近跳出条件
2.递归的层次不能太深
www.stackoverflow.com相对程序员的知乎网!
提问回答英文
hr你知道stackoverflowe吗?
一定要尝试
如何思考递归
- 第二道:!
求字符串长度: char arr[] = "bit";
strlen(arr) 求数组arr的数组长度
心里要清楚这个题目是求字符串长度
接下来要模拟实现一个strlen函数
数组名传参要的是首元素的地址,a的地址,字符的地址
字符的地址要放在一个字符指针变量内去
当我们在这个地方计算长度,返回类型int
这个时候我们简单分析一下
这是你数组的内容'a' 'b' 'c' ' \0'
这个数组叫arr
现在我们把arr传给my_strlen
my_strlen拿了一个str指针来接受
str指针存放的一定是'a'的地址
str指针指向的字符不断往后走,++直到遇到\0
+1+1就三
实现代码
if(*str ! ='\0')
{
count++;
strl++;
这个str++很重要,往后走
我们要用循环把while换if
}
return count;
题目要求不允许创建临时变量
不能有count ,做铺垫
最普通的解法
传统方法解决不了
用递归函数还是原来的函数
用递归思想来解决
队友my_strlen("bit")求第一个字符很简单,*str就行了
可以换成
啵一个下来,大事化小
先想明白
if(*str!='\0')
return 1 +my_strlen(str+1);
str+1这个值传过去,就可以指向下一个i的地址
把i地址传过去
这个strlen就可以求it的长度+1就是总长度
如果第一个字符是\0;就是0
递归难想而且要return的灵活利用
然后用图表示
这就是递归的思想!!!!!
str ++和str +1
假设str是整形;后加加是先使用再来加加
一个传进去是10一个传进去是11
讲了;两个方法,一个寄存器一个递归 - 第三种递归与迭代,迭代就是重复做一件事循环是一种迭代的方式
- n!
1*2*3*4*5*6
数学是这样定义的
int ret = Fac(n);还是利用好return
有些功能:可以使用迭代的方式来实现,也可以使用递归
- n!
- 第四道
求第n个斐波那契数
1 1 2 3 5 8 13 21 34- 这个
直接递归实现
在干啥,代码一直在跑,效率太低了,原因是进行了重复大量的计算
你要知道50,你就要知道49 48 47 46
递归会走四十多层,效率太多
那就用迭代
迭代思路:
通过c = a+b;通过赋值进行往前迁移;
效率非常快
总结:函数可以用迭代和递归方法
递归层次太深,栈溢出,效率低下这是缺点- 汉诺塔问题
三个柱子
A猪 b猪 c 猪
盘子放在柱子上
每一次动作相似,递归
这个过程就是递归
博客写汉诺塔问题
- 青蛙跳台阶
一次可以跳一个或者两个台阶
问这只青蛙,跳到n个台阶有多少种跳法
就斐波数列的问题!
经典的笔试题
- 汉诺塔问题
- 这个
函数的递归
最新推荐文章于 2024-08-08 19:15:10 发布
![](https://img-home.csdnimg.cn/images/20240711042549.png)