数据结构之递归

数据结构递归的学习:

简介

递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。递归一词还较常用于描述以自相似方法重复事物的过程。例如,当两面镜子相互之间近似平行时,镜中嵌套的图像是以无限递归的形式出现的。也可以理解为自我复制的过程。

在谷歌搜索中由这样的彩蛋。

满足条件

  1. 一个问题的解可以分解为几个子问题的解
  2. 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
  3. 存在递归终止条件

秘诀

写递归代码的关键就是找到如何将大问题分解为小问题的规律,并且基于此写出递推公式,然后再推敲终止条件,最后将递推公式和终止条件翻译成代码。

案例

斐波那契数列

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

public static int fib(int num) {
if(num == 1 || num == 2) {
return 1;
}else {
return fib(num - 2) + fib(num - 1);
}
}

public static void main(String[] args) {

for(int i = 1;i <= 10;i++) {
System.out.print(fib(i) + "\t");
}
}
}

汉诺塔

汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石]柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。

图片来源:https://www.zhihu.com/question/24385418

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
import java.util.Scanner;

public class Hanoi {
static long s = 0;

public static void main(String args[]) {

int n = 0;
System.out.println("请输入汉诺塔的层数:");
Scanner console = new Scanner(System.in);
n = console.nextInt();
System.out.println("汉诺塔层数为" + n);
System.out.println("移动方案为:");
hanoi(n, 'a', 'b', 'c');
System.out.println("需要移动次数:" + s);

}

static void hanoi(int n, char a, char b, char c) { //a为初始塔,b为中间塔,c为目标塔
if (n == 1){
System.out.println("n=" + n + " " + a + "-->" + c);
s++;
}
else{
hanoi(n-1,a,c,b);
System.out.println("n=" + n + " " + a + "-->" + c);
hanoi(n-1,b,a,c);
s++;
}
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值