这里将自己学习java及其应用的一些笔记、积累分享一下,如果涉及到了文章、文字侵权,请联系我删除或调整。
一、方法的递归
1.1 概述
- 在方法中,调用自身
void f() {f();}
用f()方法求阶乘
f(5)
f(4)
f(3)
f(5)
5*f(4)
4*f(3)
3*f(2)
2*f(1)
1*f(0)
- 把复杂问题,一步一步地简化,简化成最简问题,再反向倒推,求出结果
- 一般不同时做多次递归调用,否则运算量会急剧增加,应考虑用循环代替
1.2 练习:递归求阶乘
项目:递归求阶乘
类:Test1
package day0603;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
System.out.print("输入整数求阶乘:");
int n = new Scanner(System.in).nextInt();
long r = f(n);
System.out.println(r);
}
private static long f(int n) {
//阶乘的最简问题
if(n == 0) {
return 1;
}
return n*f(n-1); //递归调用自身
}
}
1.2 练习:递归求斐波那契数
1 1 2 3 5 8 13 21 34 55 89 144 233 ...
项目:斐波那契数
类:Test1
package day0604;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
System.out.print("求第几个斐波那契数:");
int n = new Scanner(System.in).nextInt();
long r = g(n);
System.out.println(r);
}
private static long g(int n) {
/*
* 1 1 2 3 5 8
* a b
*
* b=a+b
* a=b-a
*/
long a = 1;
long b = 1;
if(n==1 || n==2) {
return 1;
}
//从第3个,求到第n个
for(int i=3; i<=n; i++) {
b=a+b;
a=b-a;
}
return b;
}
//反例,效率极低
private static long f(int n) {
//斐波那契数最简问题
if(n==1 || n==2) {
return 1;
}
return f(n-1) + f(n-2);
}
}
1.3 练习:求汉诺塔
项目:递归求汉诺塔
类:Test1
package day0605;
import java.util.Scanner;
public class Test1 {
public static void main(String[] args) {
System.out.print("玩几层汉诺塔:");
int n = new Scanner(System.in).nextInt();
f(n, "A", "B", "C");
}
private static void f(
int n,
String z1,
String z2,
String z3) {
if(n==1) { //最简问题
System.out.println(z1+"->"+z3);
return;
}
//n层简化成n-1层,递归玩n-1层汉诺塔
//从z1,经过z3配合,到z2
f(n-1, z1, z3, z2);
//最底下一层,直接从z1到z3
System.out.println(z1+"->"+z3);
//z2上的n-1层汉诺塔,经过z1配合,移动到z3
f(n-1, z2, z1, z3);
}
}