是否可以使用隐藏/额外参数初始化变量?

时间:2015-11-18 01:01:02

标签: javascript recursion methods arguments

请记住,我只编写了2周的代码,我找不到任何关于如何使用递归函数调用中的隐藏/额外参数初始化变量的内容。可能吗?并且,如果可能的话,是否有这样做是最好的做法?

这个问题出现了,因为我正在通过完成对CoderByte challenge number 10的超级优雅答案(字母汤 - 收取字符串并返回字母顺序相同长度的字符串)。 [注意:是的,我知道我的答案是愚蠢的,并且有更好的方法来解决问题。我不需要帮助解决这个问题。我只是将此代码作为我的问题的上下文。]

基本上,我问是否有办法删除newStr作为参数(因为Java Script函数可以接受额外的参数)并仍然传递递归增长的答案字符串?如果我只是删除newStr作为参数,则不再初始化newStr。但是,如果我在函数体中初始化newString(var newStr =“”),我无法继续以递归方式传递我的排序字符串。如果有办法,那么这种方法是否有意义?或者,这只是一个标志,上面写着“做另一种方式。”

完整代码:

function AlphabetSoup(str, newStr) { 
  var alphabet = "abcdefghijklmnopqrstuvwxyz";
  var testVal= 0;
  //I'M ATTEMPTING TO PASS THROUGH AN ANSWER STRING THAT IS GROWING RECURSIVELY
  if (newStr == null)
    var newStr = "";
  if (str.length == 0)
    return newStr;
  for (var i = 1; i < str.length; i++) {
    if (alphabet.indexOf(str[0]) <= alphabet.indexOf(str[i])) {
      testVal += 1;
    }
  }
  // When the first letter, str[0], is ealier in the alphabet than every other letter
  if (testVal == (str.length - 1)) {
    //add the first letter to the newStr
    newStr = newStr + str[0];
    //remove the first letter from the input string
    str = str.substr(1);
    //recursively call AlphabetSoup to continue building newStr
    return AlphabetSoup(str, newStr);
  }
  //When the first letter isn't the earliest in the alphabet
  else {
    //put in in the back of str
    str = str.substr(1) + str[0];
    //until we find the next letter earliest in the alphabet
    return AlphabetSoup(str, newStr);
  }
}

console.log(AlphabetSoup("hooplah"));

2 个答案:

答案 0 :(得分:1)

当然,您可以检查strsplit("760–563", "–") #[[1]] #[1] "760" "563" 并使用arguments.length初始化您的变量,如果这是您所指的“ JavaScript函数可以接受额外的参数”,但那将是相当粗糙的。在那里有这个论点是没有错的。如果您不想将它公开给调用者,请将递归函数包装在另一个只有一个参数的函数中。

答案 1 :(得分:0)

在开头检查newStr的想法是JS中的常见模式。但请不要检查它是null,还是undefined

if (typeof newStr == "undefined") {
    var newStr = "";
}

如果您编写ES6(或Cof​​feescript),您可以为您的参数设置默认值:

function AlphabetSoup(str, newStr = '') {
    // ...
}