javascript - 如何防止递归函数重新初始化累加变量?

标签 javascript variables recursion

这个函数是用 JavaScript 编写的,但我认为这个概念可以用其他一些编程语言来实现。

function uniteUnique(arr) {
    let seenBefore = []; //the accumulating array
    for (let item of arguments) {
        if (typeof (item) == "object") {
            uniteUnique(...item);
        }
        else if (!seenBefore.includes(item)) {
            seenBefore.push(item);
        }
    }
    return seenBefore;
}

简而言之,该函数迭代它作为参数接收的数组,这些数组本身可能包含也可能不包含其他数组。这些数组的最深层次包含int值(value)观。该函数返回一个包含所有 int 的数组。 s (即出现在嵌套数组中的那些),但它只返回每个 int 一次,即使它出现了不止一次。

我的问题在于,每次递归返回更高级别时,它都会再次初始化包含已保存 int 的数组。 s,即函数需要返回的数组( seenBefore ),因此破坏了整个过程。一方面,我必须在函数启动时初始化数组,但另一方面,它被多次初始化并且丢失了之前存储的值。

例如,如果我要运行该函数
uniteUnique([1, 3, [6, 3], 2], [5, 2, 1, 4], [2, 1]);
输出应该是
[1,3,6,2,5,4]
因为该函数必须按处理顺序仅返回一次偶然发现的数字。该函数实际上返回一个空数组,因为它在函数从递归的最顶层返回之前再次初始化。

我怎样才能绕过这个问题?

(P.S:我知道这可以通过将累加数组从函数中拉出到不同的范围来“解决”,但这会导致其他问题,例如每次运行函数之前都需要重新初始化累加数组不止一次。)

最佳答案

你错误地识别了你的问题。每次调用uniteUnique()对局部变量 seenBefore 有一个单独的值-- 在递归调用期间没有任何东西被“再次初始化”。

你真正的问题是这条线:

uniteUnique(...item);

丢弃该函数调用的结果,因此任何嵌套数组的内容都将被忽略。您需要在某处分配此函数的返回值并使用它。

您可能还想将此函数调用的条件更改为:
if (Array.isArray(item)) {

作为当前状态typeof item == "object"将包括无法迭代的对象。

关于javascript - 如何防止递归函数重新初始化累加变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54412311/

相关文章:

javascript - AngularJS - 在没有 jQuery 的指令中将 HTML 元素添加到 dom

javascript - 使用动画更改模式内容并调整窗口大小

php - 检索一个 php 值并在 javascript 中使用它

html - 使用全局变量来包含 css

wpf - 如何在 XAML 中定义变量?

javascript - Font Awesome + Bootstrap 工具栏动画问题

javascript - 动态图像中的居中文本

java - 如何递归查找网站上的所有URL——java

java - Java 中的斐波那契内存/动态编程

c# - 如何使用 SQLite-Net Extensions 实现递归关系