Day3递归2

视频学习来源:B站UP正月点灯笼https://www.bilibili.com/video/av9855434
递归recursion

一、什么是递归
1.递归相关的概念有:函数,循环(loop)
2. 递归的定义:函数自己调用自己

递归的两个重要组成部分:递归表达式(递归函数)和递归出口(可能不止一个)

下面以一个最简单的数列来说明这两部分:
1 3 5 7 9 11 13 15…
f(n)=f(n-1)+2;——递归关系,递归函数
f(1)=1——递归出口
递归出口很重要,比如f(1)=2时完全成为另外一个数列 2 4 6 8 10 12 14…

递归出口可能不止一个
如有名的斐波那契数列:1 1 2 3 5 8 13…
递归关系:f(n)=f(n-1)+f(n-2)
递归出口有两个:f(1)=1; f(2)=1;
递归出口有几个与递归函数用几个这个函数值有关系(意会吧,这句我自己乱写的)

二、具体代码怎么写:
1.关于斐波拉切数列,常见错误
int f(int n){
	if(n==1) f(n)=1;//报错:[Error] lvalue required as left operand of assignment
	else if(n==2) f(n)=1;
	else f(n)=f(n-1)+f(n-2); 
} 

lvalue :l左 value 值
operand n.操作数
assignment n.分配
我的理解是:说左边的值应该分配一个“合理合法”的左操作数

“赋值语句”的左操作数不能是一个函数,赋值只能给变量赋值!
不能写f(n)=1,但不是说明不能写f(1),写f(1),是指把实际参数传递给形参。

正确:用 return!!

int f(int n){
	if(n==1) return 1;
	else if(n==2) return 1;
	else return f(n-1)+f(n-2); 
} 
2.用递归法求一个数组的最大值

5 7 0 1 8 9 18 6 2
递归关系,:max(arr,n)=max(max(arr,n-1),n)
递归出口:max(arr,0)=arr[0]

int max(int arr[],int n){
	if(n==0) return arr[0];
	else{
		if(max(arr,n-1)>arr[n]) return max(arr,n-1);
		else return arr[n]; 
	} 
}
三、其他:

前几天快排用到的递归,没有返回值,void型函数,好像没有递归出口。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值