递归
函数/方法 直接/间接的调用本身。一般用来在数据原来的基础上加减乘除等操作
案例:斐波那契数列:
1 1 2 3 5 8 13.........第一个和第二个数字是1,其他的数字等于前两个数字之和。
Fn = F(n-1)+F(n-2)
求斐波那契第十个数,代码如下:
package Day02_sort;
// 计算第n位的斐波那契数字
public class Fibonacci {
public static void main(String[] args) {
int n = 5;
System.out.println(Fn(n));
}
//递归:代码简洁,但是涉及到的运算会随着递归层数的增加成指数级增长。
//n = 50时,程序跑起来就得等很久了
public static int Fn(int n) {
if(n == 1 || n == 2) {
return 1;
}
return Fn(n-1)+Fn(n-2);
}
}
相关题目:
20年JavaC组第三题,代码如下:
package Day02_sort;
// 如下图所示,小明用从 1 开始的正整数“蛇形”填充无限大的矩阵。
// 1 2 6 7 15 ...
// 3 5 8 14 ...
// 4 9 13 ...
// 10 12 ...
// 11 ...
// ...
// 容易看出矩阵第二行第二列中的数是 5。请你计算矩阵中第 20 行第 20 列
// 的数是多少?
public class pb01 {
// 思路:第20行20列处在45度这条线上。这条线的数字是:
// 1 5 13 25 41 ......
// 两数之差:4 8 12 16
// 每一个数都是在前面的基础上+4,可以用递归或者循环
public static void main(String[] args) {
int n = 20;
System.out.println(Fn(n));
}
// 公式:y = (n-1)*4 + y;
public static int Fn(int n) {
if(n == 1) return 1;
return Fn(n-1) + (n-1)*4;
}
}
递归与循环的关系
一道题,可以用递归解答,
那么递归可以换成循环解决吗?可以换
代码量变多。运算资源(时间复杂度)
如果发现题目用递归运行时间超出限制,那么:
换循环
加字典
例如,斐波那契数列:
Fn(5) = Fn(4) + Fn(3) ; Fn(4) = Fn(3) + Fn(2)【将Fn(3)和Fn(2)存起来】Fn(3)直接得出
递归是很重要的一个知识点,也是极客们得心应手的工具!!