「刷题警告」递归算法

时间:2022-07-24
本文章向大家介绍「刷题警告」递归算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

正文开始

递归是一种应用非常广泛的算法,或者是编程技巧。去的过程叫“递”,回来的过程叫“归”。

递归需要满足的三个条件

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

算法题

题型一

给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。由于 2 是一位数,所以返回 2。

我的思路:

  1. 当输入38时,会进行两次各位数相加的情况。即复杂问题存在多次各位数相加。
  2. 拆解后的子问题是各位数相加。
  3. 结果是个位数时,终止计算。

我的解答:

class Solution {
    public int addDigits(int num) {
        if (num < 10)
            return num;
        char[] chars = String.valueOf(num).toCharArray();
        num = 0;
        for (Character c : chars) {
            num += Integer.valueOf(c.toString());
        }
        return addDigits(num);
    }
}

别人的解法:

class Solution {
    public int addDigits(int num) {
        while (num >= 10) {
          int next = 0;
          while (num != 0) {
              next = next + num % 10;
              num /= 10;
          }
          num = next;
        }
        return num;
    }
}

题型二

递归乘法。写一个递归函数,不使用 * 运算符, 实现两个正整数的相乘。可以使用加号、减号、位移,但要吝啬一些。 示例1: 输入:A = 1, B = 10 输出:10 示例2: 输入:A = 3, B = 4 输出:12 提示: 保证乘法范围不会溢出

我的思路:

  1. 不能使用乘法的情况下,3 * 4 = 3 + 3 + 3 + 3。即存在 B 次的 A 数字的加法。
  2. 拆解后的子问题是有 A 数字的加法。
  3. 当次数满足 B 数字时,终止计算。

我的解答:

class Solution {
    public int multiply(int A, int B) {
        if (B == 0) return 0;
        return A + multiply(A, --B);
    }
}

别人的思路:

  1. 给出递归结束条件,A,B的值等于0或者1时,可以结束递归过程;
  2. 判断A和B的大小,以此选择合适的递归公式:
    1. 情况一:若A较大,则递归公式为:A * B = A * (B - 1)+ B;
    2. 情况二:若B较大,则递归公式为:A * B = B * (A - 1)+ A;

题型三

给定一个二叉树,返回它的后序遍历。 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [3,2,1]

我的思路:

  1. 了解二叉树的定义
  2. 后序遍历的规则是什么

我的解答:

没错,又刷到了知识盲点。。。

我对二叉树的仅有的认知:

一个根节点、最多两个分支节点。

有前序遍历、中序遍历、后序遍历三种方式。


小结

每周刷刷题~

本周陪前端小老弟改数据结构的时候,被 React 的前端递归惊讶到了(递归已经还给算法老师了,不知道老师有没有收到。)

这个周末,又一次成功“强迫”自己学习。

感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。