前端算法·专项攻破六:递归&回溯

199 阅读3分钟

概念理解

递归(英语: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
5N皇后问题题解hard
6括号生成题解medium
7矩阵最长递增路径题解medium

相关文章

您的点赞和评论是我持续更新的动力,感谢关注。