请记住,我只编写了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"));
答案 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(或Coffeescript),您可以为您的参数设置默认值:
function AlphabetSoup(str, newStr = '') {
// ...
}