1、方法定義中調用方法本身的現象
2、遞歸注意實現
1) 要有出口,否則就是死遞歸
2) 次數不能太多,否則就內存溢出
3) 構造方法不能遞歸使用
3、遞歸解決問題的思想和圖解:
分解和合並【先分解后合並】
1. 常見的斐波那契數列
1,1,2,3,5,8,13,21,...
特征: 從第三個數開始,每個數是前兩個數的和。
int count = 0;
private int getFibo(int i) {
if (i == 1 || i == 2) {
count = count+1;
System.out.println("第" +count+"次進行運算 並返回結果1" );
return 1;}
else
{
count = count+1;
System.out.println("第" +count+"次進行運算 "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")");
return getFibo(i - 1) + getFibo(i - 2);
}
}
@Test
public void test01() {
int value = getFibo(6);
System.out.println(value);
}



2. 階乘
10!= 10 * 9 * 8 * 7 * (... )* 1
9! = 9 * 8 * 7 * (... )* 1
8! = 8 * 7 * (... )* 1
特征:
9!=9* 8!
10! =10 * 9!
//階乘
private int get(int i){
int result = 1;
if (i == 1) {
count = count+1;
System.out.println("第" +count+"次進行運算 並返回結果* 1" );
result = result * 1;
}
else {
count = count+1;
System.out.println("第" +count+"次進行運算" + "get(" +(i-1)+")" );
result = i * get(i-1);
}
return result;
}
@Test
public void test01() {
//System.out.println(getFibo(6));
System.out.println(get(5));
}


3. 加法實現1+2+3+4+5+...+100=
//求和
private int fsum(int i){
if (i <= 0) {
count = count+1;
System.out.println("第" +count+"次進行運算並返回0" );
return 0;
}
else {
count = count+1;
System.out.println("第" +count+"次進行運算且返回 " + i +" + fsum(" +(i-1)+")" );
return (i + fsum(i-1));
}
}
@Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
System.out.println(fsum(10));
}
4. 實現打印乘法表
//打印乘法表
//for 循環實現
private void getByFor(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
}
//打印乘法表
//遞歸實現
public static void getByRecursion(int n) {//遞歸 實現
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
}
@Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
//System.out.println(fsum(10));
getByFor(8);
getByRecursion(9);
}
6. 漢諾塔游戲
三根木棒,n個依次增大的空心圈圈,每次移動一個圈圈到木棒上,且任何時候保證小的圈圈不能被大的圈圈壓在下面。
2的n次方-1

//5. 漢諾塔(又稱河內塔)問題其實是印度的一個古老的傳說
public int hanio(int n,char a,char b,char c) {
if (n == 1) {
System.out.println( n + "號盤子從" + a + "到" + c);
count = count+1;
return count;
} else {
count = count+1;
hanio(n - 1, a, c, b);//把上面n-1個盤子從a借助b搬到c
System.out.println("移動" + n + "號盤子從" + a + "到" + c);//緊接着直接把n搬動c
hanio(n - 1, b, a, c);//再把b上的n-1個盤子借助a搬到c
return count;
}
}
@Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
//System.out.println(fsum(10));
//getByFor(8);
//getByRecursion(9);
int count =hanio(3,'A','B','C');
System.out.println(count);
}
代碼:
package com.example.demo;
import org.junit.Test;
public class Test02 {
int count = 0;
//1. 斐波那契數列遞歸,用的時候請將count和輸出System.Out去除
private int getFibo(int i) {
if (i == 1 || i == 2) {
count = count+1;
System.out.println("第" +count+"次進行運算 並返回結果1" );
return 1;}
else
{
count = count+1;
System.out.println("第" +count+"次進行運算 "+ "getFibo("+(i - 1)+")"+" + getFibo("+(i - 2)+")");
return getFibo(i - 1) + getFibo(i - 2);
}
}
//2. 階乘
private int get(int i){
int result = 1;
if (i == 1) {
count = count+1;
System.out.println("第" +count+"次進行運算並返回result * 1" );
result = result * 1;
}
else {
count = count+1;
System.out.println("第" +count+"次進行運算且返回 " + i+" * get(" +(i-1)+")" );
result = i * get(i-1);
}
return result;
}
//3. 求和
private int fsum(int i){
if (i <= 0) {
count = count+1;
System.out.println("第" +count+"次進行運算並返回0" );
return 0;
}
else {
count = count+1;
System.out.println("第" +count+"次進行運算且返回 " + i +" + fsum(" +(i-1)+")" );
return (i + fsum(i-1));
}
}
//打印乘法表
//for 循環實現
private void getByFor(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
}
//打印乘法表
//4. 遞歸實現
public void getByRecursion(int n) {//遞歸 實現
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
}
//5. 漢諾塔(又稱河內塔)問題其實是印度的一個古老的傳說
public int hanio(int n,char a,char b,char c) {
if (n == 1) {
System.out.println( n + "號盤子從" + a + "到" + c);
count = count+1;
return count;
} else {
count = count+1;
hanio(n - 1, a, c, b);//把上面n-1個盤子從a借助b搬到c
System.out.println("移動" + n + "號盤子從" + a + "到" + c);//緊接着直接把n搬動c
hanio(n - 1, b, a, c);//再把b上的n-1個盤子借助a搬到c
return count;
}
}
@Test
public void test01() {
//System.out.println(getFibo(6));
//System.out.println(get(5));
//System.out.println(fsum(10));
//getByFor(8);
//getByRecursion(9);
int count =hanio(3,'A','B','C');
System.out.println(count);
}
}
package com.example.demo;
import org.junit.Test;
public class Test03 {
int count = 0;
//1. 斐波那契數列遞歸,用的時候請將count和輸出System.Out去除
private int getFibo(int i) {
if (i == 1 || i == 2) {
return 1;}
else
{
return getFibo(i - 1) + getFibo(i - 2);
}
}
//2. 階乘
private int get(int i){
int result = 1;
if (i == 1) {
result = result * 1;
}
else {
result = i * get(i-1);
}
return result;
}
//3. 求和
private int fsum(int i){
if (i <= 0) {
return 0;
}
else {
return (i + fsum(i-1));
}
}
//打印乘法表
//for 循環實現
private void getByFor(int n) {
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= i; j++) {
System.out.print(i+" * "+j+" = "+i*j+" ");
}
System.out.println();
}
}
//打印乘法表
//4. 遞歸實現
public void getByRecursion(int n) {//遞歸 實現
if (n == 1) {
System.out.println("1 * 1 = 1 ");
}
else {
getByRecursion(n-1);
for (int j = 1; j <= n; j++) {
System.out.print(n+" * "+j+" = "+n*j+" ");
}
System.out.println();
}
}
//5. 漢諾塔(又稱河內塔)問題其實是印度的一個古老的傳說
public int hanio(int n,char a,char b,char c) {
if (n == 1) {
System.out.println( n + "號盤子從" + a + "到" + c);
count = count+1;
return count;
} else {
count = count+1;
hanio(n - 1, a, c, b);//把上面n-1個盤子從a借助b搬到c
System.out.println("移動" + n + "號盤子從" + a + "到" + c);//緊接着直接把n搬動c
hanio(n - 1, b, a, c);//再把b上的n-1個盤子借助a搬到c
return count;
}
}
@Test
public void test01() {
System.out.println(getFibo(6));
System.out.println(get(5));
System.out.println(fsum(10));
getByFor(8);
getByRecursion(8);
int count =hanio(3,'A','B','C');
System.out.println(count);
}
}
