当您提到“...然后它将返回1”时,并没有结束:每个递归调用都有返回值,因此不仅仅有一个返回[[1]]
的情况;递归调用有多少次,就有多少次返回。并且每次调用都会返回一个二维数组(即金字塔形状),该数组比前一次执行的return
多一行。
让我们通过一个例子来可视化这个过程,假设函数被传入参数3。下面的表格中,每一列代表一次函数执行过程,从左到右展开。当我们进行递归调用时,会移到右边一列,当执行return
时,我们会回到左边相邻的一列。最右边的一列用来表示当前正在构建的二维数组,它从基本情况开始存在,并通过push
调用不断扩展(所有局部的prevRows
变量都引用同一个“增长中”的二维数组):
| generate(3) | generate(2) | generate(1) | prevRows |
|----------------------|----------------------|------------------|---------------------|
| generate(2) | - | - | - |
|- | generate(1) | - | - |
| | | return [[1]] | - |
| | let prevRows = [[1]] | - | [[1]] |
| | let newRow = [1, 1] | - | [[1]] |
| | prevRows.push([1, 1]) | - | [[1], [1, 1]] |
| | return prevRows | - | [[1], [1, 1]] |
| let prevRows = [[1], [1, 1]] | - | - | [[1], [1, 1]] |
| let newRow = [1, 1, 1] | - | - | [[1], [1, 1]] |
| newRow[1] = 1 + 1 = 2 | - | - | [[1], [1, 1]] |
| prevRows.push([1, 2, 1]) | - | - | [[1], [1, 1], [1, 2, 1]] |
| return [[1], [1, 1], [1, 2, 1]] | - | - | [[1], [1, 1], [1, 2, 1]] |
希望这个示例能够帮您理解递归构建帕斯卡三角的过程。