递归

递归

算法思想

​ 递归(Recurrence)是计算机、数学、运筹等领域经常使用的最强大的解决问题的方法之一。他用一种简单的方式来解决那些用其他方法解起来可能很复杂的问题。

​ 递归的基本思想是把一个问题划分为一个或多个规模更小的子问题。,然后用相同的方法解规模更小的子问题。注意,这里的子问题应该与原问题保持相同类型。

递归算法的设计:

1、找到问题的初始条件(递归入口),即当问题规模n小到某一个值时,该问题变得简单,能够直接求解。

2、设计一个策略,将一个问题划分为一个或多个一步步接近递归出口的相似的规模更小子问题。

3、将所解决的各个小问题的解结合起来,即可得到原问题的解。

递归应用

斐波那契数列

问题:

n = 0 时,F(n) = 0

n = 1 时,F(n) = 1

n >= 2 时 ,F(n) = F(n-1) + F(n-2)

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Fibonacci {

public static int Fib(int n){

if(n == 0){
return 0;
}else if(n == 1){
return 1;
}

return Fib(n-1) + Fib(n - 2);
}

public static void main(String[] args) {
System.out.println(Fib(7)); //13
System.out.println(Fib(10)); //55
}

}

汉诺塔问题

问题:有三根柱子,A,B,C,其中一根柱子自底向上叠着3片圆盘,现在将三块圆盘按大小顺序重新摆放在另一根柱子上。柱子上圆盘的大的在下面,圆盘小的在上面,且一次只能移动一个圆盘。

在这里插入图片描述

如图:我们将A柱上的三个圆盘移动到C柱中,需要借助B柱。

移动步骤:

1、 A->C
在这里插入图片描述

2、 A->B
在这里插入图片描述

3、 C->B
在这里插入图片描述

4、 A->C
在这里插入图片描述

5、 B->A
在这里插入图片描述

6、B->C
在这里插入图片描述

7、A->C
在这里插入图片描述

如果我们只移动两个圆盘:

移动步骤:

1、A->B

2、A->C

3、B->C

根据递归的思想:把一个问题划分为一个或多个规模更小且类型相同的子问题;

假设现在有n个圆盘,需要将n个圆盘从A柱移动到C柱,我们需要将上面n-1个圆盘看成一个整体,这样问题就成为了将2个圆盘从A柱移动到C柱。将n-1个圆盘移动到B柱。
在这里插入图片描述

如何将n-1个圆盘移动到B柱呢?

我们继续将n-1个圆盘划分,分成n-2和1。将n-2个圆盘移动到C柱。

直到最后只剩下两个圆盘,这样就可以轻松移动了。

代码实现:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class HanoiTest {

private static int step = 0;

public static void Move(char m,char n){
step++;
System.out.println("第" + step + "次移动 " + m + "->" + n);
}


public static void Hanoi(int n,char a,char b,char c){
if(n == 1){
Move(a,c);
}else{
Hanoi(n-1,a,c,b);
Move(a,c);
Hanoi(n-1,b,a,c);
}
}

public static void main(String[] args) {

Hanoi(3,'A','B','C');
/*
第1次移动 A->C
第2次移动 A->B
第3次移动 C->B
第4次移动 A->C
第5次移动 B->A
第6次移动 B->C
第7次移动 A->C
*/
}

}

递归
https://johnjoyjzw.github.io/2020/01/08/递归/
Author
John Joy
Posted on
January 8, 2020
Licensed under