递归设计经验(出自《算法很美》):
1.找重复(子问题);
2.找重复中的变化量(参数);
3.找参数变化趋势(出口);
练习1:求阶乘
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.print("请输入一个数字:");
int num=sc.nextInt();
System.out.println(num+"的阶乘是"+fact(num));
}
public static int fact(int num){
if(num == 1)
return 1;
else
return num*fact(num-1);
}
}
输入格式:
请输入一个数字:4
输出格式:
4的阶乘是24
练习2:打印i到j
import java.util.Scanner;
public class Main{
public static void main(String[] args){
Scanner sc=new Scanner(System.in);
System.out.print("请输入两个数字:");
int i = sc.nextInt();
int j = sc.nextInt();
f(i,j);
sc.close();
}
public static void f(int i,int j){
if(i>j){
return;
}
System.out.print(i);
f(i+1,j);
}
}
输入格式:
请输入两个数字:1 10
输出格式:
12345678910
如果不用Scanner类:
public class Main{
public static void main(String[] args){
f(1,10);//12345678910
}
public static void f(int i,int j){
if(i>j)
return;
System.out.print(i);
f(i+1,j);
}
}
输出格式:
12345678910
练习3:数组求和
public class Main{
public static void main(String[] args){
int res = f3(new int[]{1,2,3,4,5},0);
System.out.println(res);
}
public static int f3(int[] arr,int begin){
if(begin==arr.length-1){
return arr[begin];
}
return arr[begin]+f3(arr,begin+1);
}
}
输出格式:15
练习4:翻转字符串
public class Main{
public static void main(String[] args){
System.out.print(reverse("abcd",3));
}
public static String reverse(String src,int end){
if(end==0){
return ""+src.charAt(0);
}
return src.charAt(end)+reverse(src,end-1);
}
}
输出格式:dcba
练习5:斐波那契数列
public class Main {
public static void main(String[] args) {
System.out.println(fib(6));
}
public static int fib(int n) {
if(n == 1||n == 2)
return 1;
else
return fib(n-1) + fib(n-2);
}
}
输出格式:8
练习6:最大公约数
辗转相除法
public class Main{
public static void main(String[] args){
int result =text6(319,377);
System.out.println(result);
}
public static int text6(int m,int n) {
if(n==0)
return m;
return text6(n,m%n);
}
}
输出格式:29
练习7:递归形式进行插入排序
import java.util.Arrays;
public class Main{
public static void main(String[] args){
int arr[]= {5,3,6,1,2,4};
insertSort(arr,5);
System.out.print(Arrays.toString(arr));
}
public static void insertSort(int[]arr,int k){
if (k==0){
return;
}
insertSort(arr,k-1);
int x = arr[k];
int index = k-1;
while(index>-1&&x<arr[index]){
arr[index+1]=arr[index];
index--;
}
arr[index+1]=x;
}
}
输出格式:[1, 2, 3, 4, 5, 6]
练习8:汉诺塔
public class Main{
public static void main(String[] args){
printHanoiTower(3,"A","B","C");
}
public static void printHanoiTower(int N, String from, String to, String help) {
if (N == 1) {
System.out.println("move " + N + " from " + from + " to " + to);
return ;
}
else {
printHanoiTower(N-1, from, help, to) ;
System.out.println("move " + N + " from " + from + " to " + to);
printHanoiTower(N-1, help,to,from) ;
}
}
}
输出格式:
move 1 from A to B
move 2 from A to C
move 1 from B to C
move 3 from A to B
move 1 from C to A
move 2 from C to B
move 1 from A to B