概念理解
递归(英语:Recursion),又译为递回,在数学与计算机科学中,是指在函数的定义中使用函数自身的方法。
回溯法(英语:backtracking)是暴力搜索法中的一种。 回溯法采用试错的思想,它尝试分步的去解决一个问题。在分步解决问题的过程中,当它通过尝试发现,现有的分步答案不能得到有效的正确的解答的时候,它将取消上一步甚至是上几步的计算,再通过其它的可能的分步解答再次尝试寻找问题的答案。回溯法通常用最简单的递归方法来实现,在反复重复上述的步骤后可能出现两种情况:
- 找到一个可能存在的正确的答案
- 在尝试了所有可能的分步方法后宣告该问题没有答案 以上描述来自维基百科
使用场景
斐波那契数列
是典型的递归案例。
八皇后问题
是应用回溯法求解的典型案例。
例题讲解
题目: 斐波那契数列
描述
大家都知道斐波那契数列,现在要求输入一个正整数 n ,请你输出斐波那契数列的第 n 项。
要求:空间复杂度 O(1),时间复杂度 O(n) ,本题也有时间复杂度 O(logn) 的解法
输入描述:
一个正整数n
返回值描述:
输出一个正整数。
示例1
输入:
4
返回值:
3
说明:
根据斐波那契数列的定义可知
fib(1) = 1
fib(2) = 1
fib(3) = fib(3 - 1) + fib(3 - 2) = 2
fib(4) = fib(4 - 1) + fib(4 - 2) = 3
所以答案为3
示例2
输入:
1
返回值:
1
示例3
输入:
2
返回值:
1
题解:
/**
* 解法一:递归
* 时间复杂度 O(2^n)
*/
export function Fibonacci(n: number): number {
if (n === 0) return 0
if (n === 1) return 1
return Fibonacci(n - 1) + Fibonacci(n - 2)
}
/**
* 解法二:循环
* 时间复杂度 O(n)
*/
export function Fibonacci(n: number): number {
if (n <= 0) return 0
if (n === 1) return 1
let n1 = 1 // 记录 n - 1 的结果
let n2 = 0 // 记录 n - 2 的结果
let res = 0
for (let i = 2; i <= n; i++) {
res = n1 + n2
// 记录中间结果
n2 = n1
n1 = res
}
return res
}
题集&题解
序号 | 题目 | 题解 | 难度 |
---|---|---|---|
1 | 没有重复项数字的全排列 | 题解 | medium |
2 | 有重复项数字的全排列 | 题解 | medium |
3 | 岛屿数量 | 题解 | medium |
4 | 字符串的排列 | 题解 | medium |
5 | N皇后问题 | 题解 | hard |
6 | 括号生成 | 题解 | medium |
7 | 矩阵最长递增路径 | 题解 | medium |
相关文章
- 前端算法入门一:刷算法题常用的JS基础扫盲
- 前端算法入门二:时间空间复杂度&8大数据结构的JS实现
- 前端算法入门三:5大排序算法&2大搜索&4大算法思想
- 前端面试算法高频100题(附答案,分析思路,一题多解)
您的点赞和评论是我持续更新的动力,感谢关注。