JS 中带递归的帕斯卡三角形 - 要求解释

问题描述

我已经检查了其他主题。看起来这些问题主要与 C++ 和 Python 开发人员有关,但希望对递归有更好的了解。

帕斯卡三角形是一个三角形,它的边是 1,内部是上面两个数字之和:

        1
       1 1
      1 2 1
     1 3 3 1
    1 4 6 4 1
        .
        .
        .            

代码如下:

function pascalTriangle(row,col) {
    if (col === 0) {
        return 1;
    } else if (row === 0) {
        return 0;
    } else {
        return pascalTriangle(row - 1,col) + pascalTriangle(row - 1,col - 1);
    }
}

代码不绘制图表,只返回三角形中最里面的值。

我的问题是关于递归 else 语句:

调用栈是如何执行else语句的? 这条线背后的逻辑实际上是什么?

如果您愿意提供帮助,则可以获得奖励

在完成特定行的执行后如何让您的代码移动到下一行?

解决方法

让我们从一个相当笼统的解释开始,并在此过程中变得更具体,以获得对递归的更好直觉。递归是将问题分解为最小的实例,然后将这些实例一个一个地组合起来以获得解决方案的策略。

给定问题的最小实例是什么? 01,因为它们是由两个基本情况返回的。每个递归步骤最终都会产生这些基本情况之一。由于我们有两个不同的递归步骤 pascalTriangle(row - 1,col)pascalTriangle(row - 1,col - 1),因此可能有以下排列:

0 + 0
0 + 1
1 + 0
1 + 1

这些操作代表给定问题的最小实例。请注意,您可以用基本情况替换递归步骤,但您得到的只是递归算法的快照。大局涉及更多。

递归算法的另一个重要特性我们还没有谈到:它们创建嵌套的计算结构。嵌套是递归所固有的。让我们可视化由 pascalTriangle 创建的嵌套结构。我们可以通过替换手动执行此操作,也可以通过调整函数自动执行此操作:

function pascalTriangle(row,col) {
    if (col === 0) {
        return 1;
    } else if (row === 0) {
        return 0;
    } else {
        return `(${pascalTriangle(row - 1,col)} + ${pascalTriangle(row - 1,col - 1)})`;
    }
}

console.log(pascalTriangle(4,2));
// ((((0 + 0) + (0 + 1)) + ((0 + 1) + 1)) + (((0 + 1) + 1) + 1))

这是一个合成的嵌套结构,相当于您的递归计算实际创建的中间结构。如果你总结一下,你会得到 6,这是预期的结果。

也许你已经注意到我上面列出的排列是错误的。对于给定的算法,只有 0 + 00 + 1 是可能的。

,

这似乎有效

PrintList

您发布的函数只是计算位置(行,列)上元素的值
您可能已经知道,可以将上面一行中的两个数字相加来计算值,而上面一行中的数字是使用上面一行的数字等计算出来的。
所以这就是为什么该函数作为递归