「刷题警告」递归算法
时间:2022-07-24
本文章向大家介绍「刷题警告」递归算法,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
正文开始
递归是一种应用非常广泛的算法,或者是编程技巧。去的过程叫“递”,回来的过程叫“归”。
递归需要满足的三个条件
- 一个问题的解可以分解为几个子问题的解;
- 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样;
- 存在递归终止条件。
算法题
题型一
给定一个非负整数 num,反复将各个位上的数字相加,直到结果为一位数。 示例: 输入: 38 输出: 2 解释: 各位相加的过程为:3 + 8 = 11, 1 + 1 = 2。由于 2 是一位数,所以返回 2。
我的思路:
- 当输入38时,会进行两次各位数相加的情况。即复杂问题存在多次各位数相加。
- 拆解后的子问题是各位数相加。
- 结果是个位数时,终止计算。
我的解答:
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 提示: 保证乘法范围不会溢出
我的思路:
- 不能使用乘法的情况下,3 * 4 = 3 + 3 + 3 + 3。即存在 B 次的 A 数字的加法。
- 拆解后的子问题是有 A 数字的加法。
- 当次数满足 B 数字时,终止计算。
我的解答:
class Solution {
public int multiply(int A, int B) {
if (B == 0) return 0;
return A + multiply(A, --B);
}
}
别人的思路:
- 给出递归结束条件,A,B的值等于0或者1时,可以结束递归过程;
- 判断A和B的大小,以此选择合适的递归公式:
- 情况一:若A较大,则递归公式为:A * B = A * (B - 1)+ B;
- 情况二:若B较大,则递归公式为:A * B = B * (A - 1)+ A;
题型三
给定一个二叉树,返回它的后序遍历。 示例: 输入: [1,null,2,3] 1 2 / 3 输出: [3,2,1]
我的思路:
- 了解二叉树的定义
- 后序遍历的规则是什么
我的解答:
无
没错,又刷到了知识盲点。。。
我对二叉树的仅有的认知:
一个根节点、最多两个分支节点。
有前序遍历、中序遍历、后序遍历三种方式。
小结
每周刷刷题~
本周陪前端小老弟改数据结构的时候,被 React 的前端递归惊讶到了(递归已经还给算法老师了,不知道老师有没有收到。)
这个周末,又一次成功“强迫”自己学习。
感谢各位小伙伴的阅读,这里是一个技术人的学习与分享。
- 厚土Go学习笔记 | 35. web服务器实现动态路径
- 数据库连接池、dbutil_知识点全掌握
- Golang 序列化之 ProtoBuf
- Golang RPC 之 gRPC
- 解决连通性问题的四种算法
- 使用shell批量生成数据整合式迁移的脚本(r8笔记第52天)
- Jdbc知识点全整理,你值得拥有 (1)
- SSD: Single Shot MultiBox Detector 深度学习笔记之SSD物体检测模型
- dg broker校验失败的一个奇怪问题(r8笔记第50天)
- golang 几种字符串的连接方式
- 整理ING
- dg broker校验失败的一个奇怪问题(二) (r8笔记第51天)
- Jdbc知识点全整理,你值得拥有 (2)
- 抓住“新代码”的影子 —— 基于GoAhead系列网络摄像头多个漏洞分析
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 常用方法(文件夹操作)
- 常用方法(文件名操作)
- 构建File对象
- 两个常用静态变量
- Spring MVC 整合 Servlet 3.0
- 初探 SpringBoot 自动装配
- 报错405:HTTP method GET is not supported by this URL
- 思科模拟器:网络安全实验
- Django入门:基于 Django 的 Web 页面开发
- 从零开始重新认识 Spring Framework
- 思科模拟器:高级交换实验
- ElasticSearch 基本的查询命令+集成 SpringBoot
- 数据库能力测试:SQL 语句改错
- IDEA 导入并运行 Eclipse 的 JavaWeb 项目
- 使用思科模拟器 Cisco Packet Tracer 模拟交换机基本配置