【问题标题】:variable isn't getting saved变量没有被保存
【发布时间】:2021-08-24 14:36:06
【问题描述】:

我正在尝试使用递归来解决问题。目标是获取一个输入字符串句子,并返回一个新句子,其中每个单词的第一个字母被删除,直到每个单词的第一个字母是元音。

这是我的尝试:

function deleteConsonants(sentence) {
    let words = sentence.split(" ");
    let newWords = [];
    for (let i = 0; i < words.length; i++) {
        let newWord = shifter(words[i]);
        newWords.push(newWord);
    }
    return newWords.join(" ");
}

function shifter(word) {
    let vowels = "aeiouAEIOU";
    let wordArr = word.split("")
    if (!vowels.includes(wordArr[0])) {
        wordArr.shift()
        newWordArr = wordArr.join("")
        shifter(newWordArr)
    }
    return word
}

// let a = deleteConsonants("I love pizza") // "I ove izza"
// let b = deleteConsonants("This is blasphemy sir") // "is is asphemy ir"

// console.log(a)
// console.log(b)

我运行了 Chrome 的调试器,似乎函数“shifter”工作正常,直到它到达返回单词的步骤。我的变量“newWord”,被推送到新数组的变量,由于某种原因最终成为旧的,未更改的单词版本。

【问题讨论】:

  • 应该是return shifter(newWordArr)
  • 我刚才在 replit 中尝试了这个,但它给了我错误“超出最大调用堆栈大小”
  • 那你放错地方了,我只加了return语句,把return放在递归调用之前。
  • @luk2302 想让你把退货放在这里; “return shifter(newWordArr)”~第 19 行我刚刚复制了它,它可以工作。

标签: javascript recursion return-value


【解决方案1】:

这样的事情应该可以工作:

function deleteConsonants(sentence) {
    let words = sentence.split(" ");
    let newWords = [];
    for (let i = 0; i < words.length; i++) {
        let newWord = shifter(words[i]);
        newWords.push(newWord);
    }
    return newWords.join(" ");
}

function shifter(word) {
    let vowels = "aeiouAEIOU";
    let wordArr = word.split("")
    if (!vowels.includes(wordArr[0])) {
        wordArr.shift()
        newWordArr = wordArr.join("")
        return shifter(newWordArr)
    }
  return word
}

如果您删除 if 块之外的返回,您将收到“超出最大调用堆栈大小”错误。两个都需要

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-26
    • 2016-12-02
    • 2017-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多