Thursday, March 3,2022
函数自己调自己
此时死递归
栈溢出
//练习1
执行到print(n/10)的时候此句代码未结束,还需要再次执行 print(),将12传入
所以它下面的printf("%d",n%10);不打印执行
又下一层递归,此时n=1 ,if条件不满足,跳过直接打印printf("%d",n%10);
打印完1
返回上一层打印2,
返回上一层打印3,
返回上一层打印4。
循环的 print(n/10);要输出的 printf("%d",n%10);
print(1234);
print(123);4
print(12);3 4
print(1);2 3 4
//递归两个必要条件
//栈溢出
内存栈空间,递归时,每调用一次函数分配一个空间,
总会耗尽栈空间而溢出
//练习2
编写函数不允许创建临时变量,求字符串的长度
求字符串的长度
要保证str++后能再返回去再次判断,所以if应该改为while
但题目要求为,不能创建临时变量,即不能有count
递归
str+1 是下一个的地址,不是字符。所以相当于str+1为一个整体传给了下一个形参
如果是str++就是错误的,留下的是新址,传过去的值是原来的值str,而不是新值str+1
//递归与迭代
迭代是重复做一件事情,而不一定是在循环,而循环是一种迭代方式
//练习3:求n的阶乘(不考虑溢出)
//练习4
求第n个斐波那契数。(不考虑溢出)
前两个数之和等于第3个数
一直在跑,因为这样的效率太低,一直重复大量的计算
要想计算50,那就必须知道49,48,同理,逐层往下
正着求,就不用重复计算了,用循环或者迭代方式,第三个开始
递归:效率低,栈溢出,有局限,但写出来简单
用迭代代替
a与c调换,都要借助b