递归算法
递归概述
递归:递进回归
代码中的体现:方法内部调用方法本身
递归的注意事项
递归的注意事项:
1.定义一个方法且该方法必须有形参
2.必须要有程序出口且递归的次数最好不要太多了
--->避免发生栈溢出StackOverflowError
3.在该方法内部调用方法自身的时候,传入的参数要朝着出口方向变化
递归的关键
写递归最重要的是找到规律
递归的简单应用
求1-n的和
问题描述
求1~n的和,用递归去实现
问题分析
对于该问题,比如说求1~7的和:
1~7的和() = 7 + 1~6的和()
1~6的和() = 6 + 1~5的和()
1~5的和() = 5 + 1~4的和()
1~4的和() = 4 + 1~3的和()
1~3的和() = 3 + 1~2的和()
1~2的和() = 2 + 1~1的和()
1~1的和() = 1--->程序出口
规律
求1~n的和() = n + [1~(n - 1)的和()]
具体代码
package com.tan.recursion;
public class Recursion {
public static void main(String[] args) {
System.out.println("sum(7) = " + sum(7));
}
public static int sum(int num){
if (num == 1){
return 1;
}
return num + sum(num - 1);
}
}
求1-n的阶乘
问题描述
求1~n的阶乘,用递归去实现
问题分析
对于该问题,比如说求1~7的阶乘():
1~7的阶乘() = 7 * 1~6的阶乘()
1~6的阶乘() = 6 * 1~5的阶乘()
1~5的阶乘() = 5 * 1~4的阶乘()
1~4的阶乘() = 4 * 1~3的阶乘()
1~3的阶乘() = 3 * 1~2的阶乘()
1~2的阶乘() = 2 * 1~1的阶乘()
1~1的阶乘() = 1--->程序出口
规律
1-n的阶乘 = n * (n-1)的阶乘
具体代码
package com.tan.recursion;
public class Recursion {
public static void main(String[] args) {
System.out.println("factorial(5) = " + factorial(5));
}
public static int factorial(int num){
if(num == 1) return 1;
return num * factorial(num-1);
}
}
求斐波那契数列
问题描述
求斐波那契数列,用递归去实现
问题分析
斐波那契数列:
F(0)=1,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*)
出口:F(0)=1,F(1)=1
规律
F(n)=F(n - 1)+F(n - 2)
具体代码
package com.tan.recursion;
public class Recursion {
public static void main(String[] args) {
System.out.println("fibonacci(20) = " + fibonacci(20));
}
public static int fibonacci(int num){
if(num == 1 || num == 2){
return 1;
}
return fibonacci(num - 1) + fibonacci(num - 2);
}
}