数据结构之:递归思想
创始人
2024-02-03 18:59:26
(一)递归概念
将复杂问题 递推分解为最简问题 然后将结果回归的过程 Windows - Linux Linux = Linux is not Unix 使用方法: 自己调用自己
(二)斐波那契数列
兔子问题 有一对大兔子 每个月繁衍 一对小兔子(一公一母) 小兔子 每个月生长为 大兔子 现有一对小兔子 一年后 有多少对? M1 1 A M2 1 A~ M3 2 A->B M4 3 A->C + B~ M5 5 A->D + B->E + C~ M6 8 A->F + B->G + C->H + D~ + E~ 当前的所有兔子 = 上个月的所有兔子 + 这个月新生的兔子(可以繁衍的兔子) = 上个月的所有兔子数量 + 上上个月的所有兔子数量(经过了一个月的生长周期) Mn = M(n-1) + M(n-2) M5 = M4 + M3 = (M3+M2) + (M2+M1) = (M2+M1 + M2) + (M2+M1) = 1+1+1 + 1+1 = 5 M1=1 M2=1 使用方式: 1)推导出递推公式 —— 找规律 2)找到递推的出口 —— 找出口
    public static int fib(int N) {if (N == 1) return 1;if (N == 2) return 1;System.out.println("求第" + N + "个月的兔子数量");System.out.println("转化为求第" + (N - 1) + "个月和第" + (N - 2) + "个月的兔子数量");return fib(N - 1) + fib(N - 2);}
大部分递归 可以转化为迭代处理 Make it work,Make it right,Make it fast 思路:使用数组存储,通过n-1和n-2的值进行计算

    public static int fib1(int N) {// 6 —— 0 1 2 3 4 5// fib(0) = 0 有时需要处理if (N <= 1) return 1;int[] arr = new int[N];arr[0] = 1;arr[1] = 1;for (int i = 2; i < arr.length; i++) {arr[i] = arr[i - 1] + arr[i - 2];}return arr[N - 1];}
递归经典应用之汉诺塔 汉诺塔
印度的恒河 瓦拉那西 诞生婆罗门教 放了三根柱子,其中一个根柱子上放了64个圆盘 需要将全部圆盘 移动到另一根柱子上 并且 每次只能移动一个 移动过程中 小圆盘必须在大圆盘之上 为何不可完成?
分析: 一个圆盘 A->C 两个圆盘 A->B A->C B->C 三个圆盘 A->C A->B C->B (把前两个圆盘 从A移动到B) A->C (移动最大的圆盘) B->A B->C A->C (再把前两个圆盘 从B移动到C) N个圆盘 先把前N-1个圆盘 从A移动到B (经由C) 再把最大的圆盘 从A移动到C 最后把前N-1个圆盘 从B移动到C (经由A) 移动次数 H(1) = 1 H(2) = 3 H(3) = H(2) + 1 + H(2) = 7 H(4) = 7 + 1 + 7 = 15 H(N) = H(N-1) + 1 + H(N-1) = 2^N - 1
// 四个参数 有n个圆盘 需要从A柱子移动到C 经由B
// 起始 中间 终点
public static void hanoi(int n, char A, char B, char C) {
// 出口
if (n == 1) {
System.out.println(A + "->" + C);
return;
}
// 先把前N-1个圆盘 从A移动到B (经由C)
// 再把最大的圆盘 从A移动到C
// 最后把前N-1个圆盘 从B移动到C (经由A)
hanoi(n - 1, A, C, B);
System.out.println(A + "->" + C);
hanoi(n - 1, B, A, C);
}
public class Fibonacci {public static void main(String[] args) {System.out.println(fib1(6));}// 返回第n个月有多少只兔子public static int fib(int N) {if (N == 1) return 1;if (N == 2) return 1;System.out.println("求第" + N + "个月的兔子数量");System.out.println("转化为求第" + (N - 1) + "个月和第" + (N - 2) + "个月的兔子数量");return fib(N - 1) + fib(N - 2);}public static int fib1(int N) {// 6 —— 0 1 2 3 4 5// fib(0) = 0  有时需要处理if (N <= 1) return 1;int[] arr = new int[N];arr[0] = 1;arr[1] = 1;for (int i = 2; i < arr.length; i++) {arr[i] = arr[i - 1] + arr[i - 2];}return arr[N - 1];}
}
public class Hanoi {public static void main(String[] args) {//三个圆盘  A->C   A->B  C->B (把前两个圆盘 从A移动到B)//         A->C  (移动最大的圆盘)//         B->A  B->C  A->C (再把前两个圆盘 从B移动到C)hanoi(3, 'A', 'B', 'C');}// 四个参数  有n个圆盘  需要从A柱子移动到C  经由B//                                  起始    中间     终点public static void hanoi(int n, char A, char B, char C) {// 出口if (n == 1) {System.out.println(A + "->" + C);return;}//    先把前N-1个圆盘  从A移动到B (经由C)//    再把最大的圆盘  从A移动到C//    最后把前N-1个圆盘  从B移动到C (经由A)hanoi(n - 1, A, C, B);System.out.println(A + "->" + C);hanoi(n - 1, B, A, C);}
}

相关内容

热门资讯

埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...
应用未安装解决办法 平板应用未... ---IT小技术,每天Get一个小技能!一、前言描述苹果IPad2居然不能安装怎么办?与此IPad不...
脚上的穴位图 脚面经络图对应的... 人体穴位作用图解大全更清晰直观的标注了各个人体穴位的作用,包括头部穴位图、胸部穴位图、背部穴位图、胳...
长白山自助游攻略 吉林长白山游... 昨天介绍了西坡的景点详细请看链接:一个人的旅行,据说能看到长白山天池全凭运气,您的运气如何?今日介绍...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
demo什么意思 demo版本... 618快到了,各位的小金库大概也在准备开闸放水了吧。没有小金库的,也该向老婆撒娇卖萌服个软了,一切只...
世界上最漂亮的人 世界上最漂亮... 此前在某网上,选出了全球265万颜值姣好的女性。从这些数量庞大的女性群体中,人们投票选出了心目中最美...
猫咪吃了塑料袋怎么办 猫咪误食... 你知道吗?塑料袋放久了会长猫哦!要说猫咪对塑料袋的喜爱程度完完全全可以媲美纸箱家里只要一有塑料袋的响...
埃菲尔铁塔在哪 中国仿建埃菲尔... 2019年4月26日,广西南宁市,街头惊现一座巨型山寨版埃菲尔铁塔,高约20米,白色塔身,造型逼真,...
苗族的传统节日 贵州苗族节日有... 【岜沙苗族芦笙节】岜沙,苗语叫“分送”,距从江县城7.5公里,是世界上最崇拜树木并以树为神的枪手部落...
北京的名胜古迹 北京最著名的景... 北京从元代开始,逐渐走上帝国首都的道路,先是成为大辽朝五大首都之一的南京城,随着金灭辽,金代从海陵王...