关于JavaScript递归实现杨辉三角LeetCode解法的疑问求助
LeetCode《杨辉三角》递归解法解析
一、prevRows的数据类型
prevRows是二维数组,也就是“数组嵌套数组”的结构。每一层递归返回的prevRows,都是对应numRows-1时的完整杨辉三角——其中每个子数组代表杨辉三角的一行。比如当递归得到numRows=2的结果时,prevRows就是[[1], [1,1]]。
二、递归逻辑拆解(以输入numRows=5为例)
递归的核心思路是:先搞定规模更小的杨辉三角,再基于这个小三角拼出更大的。首先明确递归的终止条件:
- 当
numRows=1时,直接返回[[1]](只有一行的三角) - 当
numRows=2时,直接返回[[1], [1,1]](两行的三角)
接下来一步步看输入5时的递归流程:
- 要生成5行的三角,得先递归调用拿到4行的完整三角(这就是prevRows)
- 要生成4行的三角,先递归拿到3行的三角
- 要生成3行的三角,先递归拿到2行的三角
- 要生成2行的三角,先递归拿到1行的三角——触发终止条件,返回
[[1]] - 拿到1行的结果后,构建2行的三角:在
[[1]]后面加一行[1,1],返回[[1], [1,1]] - 拿到2行的结果后,构建3行的三角:
- 新增第三行,长度为3,首尾固定是1
- 中间的元素(索引1)是上一行(也就是prevRows的最后一行
[1,1])的索引0和1的元素相加:1+1=2,所以第三行是[1,2,1] - 把这行加到prevRows末尾,得到
[[1], [1,1], [1,2,1]],作为3行的结果返回
- 拿到3行的结果后,构建4行的三角:
- 新增第四行,长度4,首尾1
- 索引1的元素:上一行
[1,2,1]的索引0+1 →1+2=3 - 索引2的元素:上一行的索引1+2 →
2+1=3 - 第四行是
[1,3,3,1],加到prevRows后得到4行的三角返回
- 最后拿到4行的结果,构建5行的三角:
- 新增第五行,长度5,首尾1
- 索引1:上一行
[1,3,3,1]的0+1 →1+3=4 - 索引2:上一行的1+2 →
3+3=6 - 索引3:上一行的2+3 →
3+1=4 - 第五行是
[1,4,6,4,1],加到prevRows末尾就得到了5行的完整杨辉三角
三、关键代码行解析:newRow[i] = prevRows[numRows - 2][i - 1] + prevRows[numRows - 2][i];
把这行拆成几个部分看就清晰了:
prevRows[numRows - 2]:prevRows是numRows-1行的杨辉三角,它的最后一行的索引是(numRows-1)-1 = numRows-2,所以这个表达式就是拿到上一层三角的最后一行(也就是当前要生成的行的“上一行”)i-1和i:当前生成的newRow是第numRows行(索引从0开始的话是numRows-1),它的中间元素(排除首尾的1),等于上一行中位置i-1和i的元素之和——这正是杨辉三角的核心规则。比如newRow的索引1,对应上一行的0和1;索引2对应上一行的1和2,以此类推。
内容的提问来源于stack exchange,提问作者User9123
相关产品推荐
相关产品推荐

