分治法:把一个难以直接解决的大问题分割成一些规模较小的相同问题,以便各个击破,分而治之。
分治法中的子问题和原问题的类型一致,子问题不断缩小直至变成可以求解的简单问题,从而就引入了递归算法。
直接或间接调用自身的算法称为递归算法。
例子1:阶乘函数
import java.util.Scanner;
/*阶乘函数
* 递归定义:n!={1 n=0
* {n(n-1)! n>0 */
public class JieCheng {
static int result = 0; //阶乘结果
int jiecheng(int n1) {
if (n1 == 0) { //n=0
result = 1;
}
if (n1 > 0) { //n>0
result = n1 * jiecheng(n1 - 1); //递归调用
}
return result;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) { //做一个循环可以连续输入阶乘的数值
Scanner in = new Scanner(System.in);
System.out.println("-----输入阶乘的数值(n>=0)-----");
int n = in.nextInt();
JieCheng jc = new JieCheng();
jc.jiecheng(n);
System.out.println(result);
}
}
}
例子2:Fibonacci
import java.util.Scanner;
public class Fibonacci {
/**
* 菲波那切数列:
* 无穷数列:1,1,2,3,5,8......
* 递归定义:F(n)= 1...n=0
* 1...n=1
* F(n-1)+F(n-2)...n>1
*/
static int result = 0; //结果
int fibonacci(int n) {
if (n<=1) { //n<=1
result = 1;
}
if (n > 1) { //n>0
result = fibonacci(n-1)+fibonacci(n-2); //递归调用
}
return result;
}
public static void main(String[] args) {
for (int i = 0; i < 100; i++) { //为了连续输入
Scanner in = new Scanner(System.in);
System.out.println("-----输入想要的到的第n位菲波那切数列的数值(n>=1)-----");
int n = in.nextInt();
Fibonacci f = new Fibonacci();
f.fibonacci(n-1); //前面的位数是从0计起的,为了符合常识,这里n要减去1
System.out.println(result);
}
}
}