美文网首页
递归与递推

递归与递推

作者: YOLO哈哈哈 | 来源:发表于2019-01-31 10:23 被阅读0次

递归与递推

-1.
枚举形式:    状态空间规模:    一般遍历方式:
多项式      n^k,k为常数   循环(for),递推
指数       k^n, k 为常数     递归,位运算
排列        n!          递归,permutation
组合                  递归+剪枝
===============================================
-2.3个操作:
1.缩小
2.求解
3.扩展

===============================================

1· 递归实现指数型枚举(92 进阶指南)
  • 解题思路
    这是一道在1~n中随机选取多个数,输出有可能的选择方案。 这等价于每个整数可以选或不选,所有可能的方案总数共有2^n 种。这道题可以进行一次循环,利用位运算来列举所有的选择方案(位运算+ queue
    )。在这里使用递归求解,在每次递归中分别尝试某个数“选”或“不选”两条分支,将尚未确定的整数数量减少1, 从而转化为一个规模更小的同类问题。
  • 这道题的空间规模 是 2^n
import java.util.Scanner;
import java.util.ArrayList;
 public class Main{
    static int n;
    List<Integer>  res = new ArrayList<>();
    public static void main(String [] args) {
        Scanner  input = new Scanner(System.in);
        n = input.nextInt();
        Main m = new Main();
        m.calc(1);
    }

    public void calc( int x) {
         if( x == n + 1) {
            for(int i =0; i< res.length; i++ ) {
                System.out.println( res[i] + " ");
                return;
            } 
         }
        /* 不选 x 分支*/
        calc( x+1); /* 求解子问题 */
      /* 选 x 分支 */
      res.add( x);/* 记录 x 已被选择*/
      calc(x + 1);/* 求解子问题*/
      res.remove(res.size() - 1);
    }
}

2· 递归实现组合枚举(93 进阶指南)

-. 从1~n 这 n 个整数中随机选出m 个,输出所有可能的选择方案. 只需要在上方calc 函数开头,添加。 这就是所谓的“剪枝”

public vois calc(int x) {
    /* 剪枝情况:1. 已经选了超过m个数, 2.即使再选上剩余所有的数也不够 
 m个*/
    if(res.size() > m || res.size() + (n - x + 1) < m ) {
        return;
    }
}
3· 递归实现排列型枚举(94 进阶指南)

-解题思路
该问题也被称为全排问题,所有可能的方案总数有 n ! 种。在这里,递归需要求解的问题是“把指定的 n 个整数按照任意次序排列”, 在每次递归中,我们尝试把每个可用的数作为数列的下一个数,求解“把剩余的 n-1 个整数按照任意次序排列”

List<Integer> order = new ArrayList<>(); // 按顺序依次记录被选择的整数
boolean chosen[20];

public void calc(int k) {
    if( k == n + 1 ) { // 问题边界
       for(int i = 1; i <= n ; i++) {
            System.out.println( order[i] + " ");
       }
      return;   
    }
  for(int i=1; i<=n; i++) {
      if( chosen[i]) continue;
      order[k] = i;
      clac( k + 1);
      chosen[i] = false;
      order[k] = 0; // 这一行可以省略 
  }
}
4· 费解的开关(95 进阶指南)

相关文章

  • 递归与递推

    递归与递推 -1.枚举形式:状态空间规模:一般遍历方式:多项式n^k,k为常数循环(for),递推指数k^n, k...

  • js 总结六 7-18

    递归 递归技巧 假设递归函数已经写好 寻找递推关系 将递推关系的结构转换为递归体 将临界条件加入到递归体中递归思想...

  • 快速排序

    图解 思想:分治思想 快速排序思路 递推公式既然设计到递归。下意识就要想使用递归的两个必要条件 递推公式递归退出条...

  • 腾讯校招C++练习题:母牛的故事——由递归到递推

    我们都知道递推(动态规划)是递归(搜索)的反向操作,本题虽然注明“【递归】”,但同样可以用递推方式解决本题。 由于...

  • 腾讯校招C++面试题:母牛的故事——由递归到递推

    我们都知道递推(动态规划)是递归(搜索)的反向操作,本题虽然注明“【递归】”,但同样可以用递推方式解决本题。 由于...

  • 今天看看python的递归

    递归分为回推和递推两个阶段

  • 递归、迭代与递推三者的差别

    递归,递推,迭代的区别_csdn链接 递归: 程序调用自身的编程技巧称为递归,是函数自己调用自己。 使用递归要注意...

  • 斐波那契数列(Fibonacci)的几种实现

    斐波那契数列,定义: 递归求解 普通递归 尾递归 非递归递推解 利用矩阵计算 通过矩阵的快速幂实现 Matrix....

  • 111. Minimum Depth of Binary Tre

    自己想一下递归过程,就知道怎么递推了

  • 猴子吃桃--递推与递归

    题目:猴子第一天摘了若干个桃子,当即吃了一半,还不解馋,又多吃了一个;第二天,吃剩下的桃子的一半,还不过瘾,又多吃...

网友评论

      本文标题:递归与递推

      本文链接:https://www.haomeiwen.com/subject/fwkksqtx.html