一、递归的概念
1.1 什么是方法递归:所谓方法的递归是一个方法执行的内部,自己调用了自己的过程。
1.2 什么场景下可以使用方法递归?
a:大问题可以拆分为若干个子问题解
b:拆分后的子问题和原问题除了数据规模不同,解决思路完全相同。
c:必须存在递归的终止条件。(不会无限拆分,总会走到根的)
1.3 如何写出递归代码?
******对于新手来说刚开始写递归函数时,千万不要纠结函数内部的实现,要注意函数要做的事,假设已经写好直接调用即可。
import java.util.Scanner;
public class HomeWork7 {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
System.out.println(N+"的阶乘为:"+sum(N));
}
public static int sum(int i){
//终止条件
if(i<2){
return 1;
}
//我们只知道输入i的值,所以返回i,剩下的交给sum(i-1)即可
return i*=sum(i-1);
}
}
二、递归执行过程分析
例题:递归求N的阶乘
public static void main(String[] args) {
int n = 5;
int ret = factor(n);
System.out.println("ret = " + ret);
}
public static int factor(int n) {
System.out.println("函数开始, n = " + n);
if (n == 1) {
System.out.println("函数结束, n = 1 ret = 1");
return 1;
}
int ret = n * factor(n - 1);
System.out.println("函数结束, n = " + n + " ret = " + ret);
return ret; }
// 执行结果
函数开始, n = 5
函数开始, n = 4
函数开始, n = 3
函数开始, n = 2
函数开始, n = 1
函数结束, n = 1 ret = 1
函数结束, n = 2 ret = 2
函数结束, n = 3 ret = 6
函数结束, n = 4 ret = 24
函数结束, n = 5 ret = 120
ret = 120
执行过程图如下:
三、递归题目的练习
1 按顺序打印一个数字的每一位(例如 1234 打印出 1 2 3 4)
import java.util.Scanner;
public class HomeWork5 {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
num(n);
}
public static void num(int n){
if (n>9){
num(n/10);
}
System.out.print(n%10+" ");
}
}
2 写一个递归方法,输入一个非负整数,返回组成它的数字之和
import java.util.Scanner;
public class HomeWork4 {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.println("各个位数之和为:"+num(a));
}
public static int num(int n){
if(n<10){
return n;
}
return num(n%10)+num(n/10);
}
}
3 递归求斐波那契数列的第 N 项
import java.util.Scanner;
public class HomeWork3 {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int N = scanner.nextInt();
System.out.println("项斐波那契数列第"+N+"项为:"+num(N));
}
public static int num(int n){
if(n<3){
return 1;
}
return num(n-1)+num(n-2);
}
}
青蛙跳台阶问题:一只青蛙一次可以跳上 1 级台阶,也可以跳上2 级。求该青蛙跳上一个n 级的台阶总共有多少种跳法?
import java.util.Scanner;
public class HomeWork {public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int a = num(n);
System.out.println("跳上"+n+"级台阶的方法种数为:"+a+"种");
}
public static int num(int a){
if(a < 3){
return a;
}
return a = num (a-1)+num (a-2);
}
}