问题描述
我已经检查了其他主题。看起来这些问题主要与 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语句的? 这条线背后的逻辑实际上是什么?
如果您愿意提供帮助,则可以获得奖励:
在完成特定行的执行后如何让您的代码移动到下一行?
解决方法
让我们从一个相当笼统的解释开始,并在此过程中变得更具体,以获得对递归的更好直觉。递归是将问题分解为最小的实例,然后将这些实例一个一个地组合起来以获得解决方案的策略。
给定问题的最小实例是什么? 0
和 1
,因为它们是由两个基本情况返回的。每个递归步骤最终都会产生这些基本情况之一。由于我们有两个不同的递归步骤 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 + 0
和 0 + 1
是可能的。
这似乎有效
PrintList
您发布的函数只是计算位置(行,列)上元素的值
您可能已经知道,可以将上面一行中的两个数字相加来计算值,而上面一行中的数字是使用上面一行的数字等计算出来的。
所以这就是为什么该函数作为递归