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型函数,好像没有递归出口。

发布了20 篇原创文章 · 获赞 0 · 访问量 711

猜你喜欢

转载自blog.csdn.net/m0_37733257/article/details/104395375