数据结构与算法简述 递归算法

港控/mmm° 2022-03-31 13:58 345阅读 0赞

递归就是函数(方法)不断调用自身,直到得到想要的结果。

其思路是把一个大问题转化为规模很小的子问题,这些子问题性质一样,可以采用同一种方式处理,通过解决小问题来达到解决大问题的目的。

典型使用递归的有计算阶乘,汉诺塔问题等,递归有三要素:1明确的终止条件,不能一直递归下去,2终止处理办法,3能提取重复的逻辑,简单化问题。

计算阶乘

  1. /**
  2. * 递归
  3. * 阶乘
  4. */
  5. public class Factorial {
  6. /**
  7. * 计算n的阶乘
  8. */
  9. public int factorial(int n) {
  10. if(n == 1) {
  11. return 1;
  12. }
  13. return n * factorial(n-1);
  14. }
  15. public static void main(String[] args) {
  16. Factorial f = new Factorial();
  17. System.out.println(f.factorial(4));
  18. }
  19. }

汉诺塔问题

源于印度古老历史,三根柱子,有n个从小到大的圆盘放在一根柱子上,把所有圆盘移动到另外一个柱子上,并且有如下要求,每次只能移动一个,大圆盘不能在小圆盘之上,移动完之后状态和最初状态一直,上到下是从小到大的次序。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2EyODEyNDYyNDA_size_16_color_FFFFFF_t_70

使用递归的分而治之思想来解决问题,假设A柱有n个盘子,先把较小n-1个盘子当成一个整体转移到B柱,再把最后一个盘子移到C柱,依次递归循环下去,C柱为目标柱dest,A和B依次为源柱、临时柱,动态切换

代码实现

  1. /**
  2. * 递归实现汉诺塔
  3. */
  4. public class Towers {
  5. /**
  6. * 汉诺塔
  7. * @param topN 待移动圆盘数量
  8. * @param src 源头柱
  9. * @param temp 临时柱
  10. * @param dest 目标柱
  11. */
  12. private static void transfer(int topN, String src, String temp, String dest) {
  13. if(topN == 1) {
  14. System.out.println(topN + "从" + src + "移动到" + dest);
  15. } else {
  16. //把topN-1当成整体,移动到temp柱上
  17. transfer(topN-1, src, dest, temp);
  18. //把最大盘移到dest柱上
  19. System.out.println(topN + "从" + src + "移动到" + dest);
  20. //把topN-1移动到dest柱上
  21. transfer(topN-1, temp, src, dest);
  22. }
  23. }
  24. public static void main(String[] args) {
  25. transfer(6, "A", "B", "C");
  26. }
  27. }

背包问题

给定一些大小不一的物品和一个一定容量的背包,如何选择物品把背包刚好装满

  1. /**
  2. * 背包问题
  3. */
  4. public class Bags {
  5. public static void bags(int target,int[] t,int nowIndex,List<Integer> result) {
  6. if(nowIndex > t.length-1) { //终止递归
  7. return;
  8. }
  9. if(t[nowIndex] > target) { //物品比背包大,直接略过
  10. bags(target, t, nowIndex + 1, result);
  11. }else if(t[nowIndex] < target){ //物品小于背包,把物品放入背包,减小空余容量,轮询下一物品
  12. result.add(t[nowIndex]);
  13. bags(target-t[nowIndex], t, nowIndex+1, result);
  14. }else{ //物品和背包空余容量大小相等,背包刚好装满,输出结果
  15. result.add(t[nowIndex]);
  16. System.out.println(result.toString());
  17. }
  18. }
  19. public static void main(String[] args) {
  20. int[] t = {11,8,7,5,20,6,9,7};
  21. for (int i = 0; i < t.length; i++) {
  22. bags(20, t, i, new ArrayList<>());
  23. }
  24. }
  25. }

结果[8, 7, 5]、[5, 6, 9]、[20]

发表评论

表情:
评论列表 (有 0 条评论,345人围观)

还没有评论,来说两句吧...

相关阅读

    相关 数据结构算法——学习

    可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! 可能也有一大部分人知道递

    相关 数据结构算法

    1.树、二叉树 2.二叉查找树 3.平衡二叉树、红黑树 4.递归树 一、什么是递归树 如果我们把这个一层一层的分解过程画成图,它其实就是一棵树。我们给这棵树

    相关 数据结构算法简述 算法

    递归就是函数(方法)不断调用自身,直到得到想要的结果。 其思路是把一个大问题转化为规模很小的子问题,这些子问题性质一样,可以采用同一种方式处理,通过解决小问题来达到解决大问题

    相关 算法数据结构

    一、什么是递归 递归是一种解决问题的方法,将问题分解为更小的子问题,直到得到一个足够小的问题可以 被很简单的解决。通常递归涉及函数调用自身。递归允许我们编写优雅的解决方案,