递归是一种不断的调用自身的函数
它满足两个条件:1.有反复的执行过程(调用自身)。2.有跳出反复执行过程的条件(递归出口)。
递归的好处就是使得代码更少,更精炼,递归在很多的方面都有体现,例如简单的:求n项和,求阶乘。还有河内塔,全排列问题,斐波那契数列等。
例子:1.河内塔问题
import java.util.Scanner;
public class Main {
private static int count = 0;
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
hanoi(n,'a','b','c');
System.out.println(count);
}
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
hanoi(n,'a','b','c');
System.out.println(count);
}
private static void hanoi(int n, char a, char b, char c) {
// TODO Auto-generated method stub
if(n>=1){
hanoi(n-1,a,c,b);
count++;
hanoi(n-1,b,a,c);
}
}
// TODO Auto-generated method stub
if(n>=1){
hanoi(n-1,a,c,b);
count++;
hanoi(n-1,b,a,c);
}
}
}
2.求阶乘
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
recursionMulity(n);
System.out.println(recursionMulity(n));
}
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
recursionMulity(n);
System.out.println(recursionMulity(n));
}
private static Integer recursionMulity(Integer n) {
if(n==1){
return 1;
}
return n*recursionMulity(n-1);
// TODO Auto-generated method stub
}
if(n==1){
return 1;
}
return n*recursionMulity(n-1);
// TODO Auto-generated method stub
}
}
3.求n项和
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
recursionSum(n);
System.out.println(recursionSum(n));
}
// TODO Auto-generated method stub
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
recursionSum(n);
System.out.println(recursionSum(n));
}
private static Integer recursionSum(Integer n) {
if(n>0){
return n+recursionSum(n-1);
}else{
return 0;
}
// TODO Auto-generated method stub
}
if(n>0){
return n+recursionSum(n-1);
}else{
return 0;
}
// TODO Auto-generated method stub
}
}
4.将数字从小到大排序
package sort;
import java.util.Scanner;
public class Main {
//将一串数字从小到大进行排序
public static void mergeSort(int a[], int b[], int start, int last) {
int mid;
if (start < last) {
mid = (start + last) / 2;
mergeSort(a, b, start, mid);
mergeSort(a, b, mid + 1, last);
merge(a, b, start, mid, last);
//将一串数字从小到大进行排序
public static void mergeSort(int a[], int b[], int start, int last) {
int mid;
if (start < last) {
mid = (start + last) / 2;
mergeSort(a, b, start, mid);
mergeSort(a, b, mid + 1, last);
merge(a, b, start, mid, last);
}
}
private static void merge(int[] a, int[] b, int start, int mid, int last) {
// TODO Auto-generated method stub
int i = start, j = mid + 1, k = 0;
while (i <= mid && j <= last) {
if (a[i] < a[j]) {
b[k++] = a[i++];
}
if (a[i] > a[j]) {
b[k++] = a[j++];
}
}
while (i <= mid) {
b[k++] = a[i++];
}
while (j <= last) {
b[k++] = a[j++];
}
for (int i1 = 0; i1 < k; i1++) {
a[start + i1] = b[i1];
}
}
// TODO Auto-generated method stub
int i = start, j = mid + 1, k = 0;
while (i <= mid && j <= last) {
if (a[i] < a[j]) {
b[k++] = a[i++];
}
if (a[i] > a[j]) {
b[k++] = a[j++];
}
}
while (i <= mid) {
b[k++] = a[i++];
}
while (j <= last) {
b[k++] = a[j++];
}
for (int i1 = 0; i1 < k; i1++) {
a[start + i1] = b[i1];
}
}
public static void main(String[] args) {
// TODO Auto-generated method stub
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] a = new int[num];
int[] b = new int[num];
for (int i = 0; i < num; i++) {
a[i] = sc.nextInt();
}
mergeSort(a, b, 0, num - 1);
for (int i = 0; i < num; i++) {
System.out.print(a[i] + " ");
}
}
// TODO Auto-generated method stub
@SuppressWarnings("resource")
Scanner sc = new Scanner(System.in);
int num = sc.nextInt();
int[] a = new int[num];
int[] b = new int[num];
for (int i = 0; i < num; i++) {
a[i] = sc.nextInt();
}
mergeSort(a, b, 0, num - 1);
for (int i = 0; i < num; i++) {
System.out.print(a[i] + " ");
}
}
}