我试图使用递归函数来反转数组。 使用参数[“ h”,“ e”,“ l”,“ l”,“ o”],得到长度为2的字符串“ olleh”,并将其转换为数组后得到了意外结果。 有人可以解决这种情况吗?为什么字符串“ olleh”具有长度2。
let reverseString = function(s) {
if(s.length == 1) return s[0];
if(s.length > 1) {
return (s.pop() + reverseString(s)).split('');
}
}
我对这种情况感到困惑,无法弄清楚哪里出了问题...
reverseString(["h","e","l","l","o"]); //outputs ["o", "l", ",", "l", ",",
",", ",", "e", ",", ",", ",", ",", ",", ",", ",", "h"]
如果我更改返回值
return (s.pop() + reverseString(s)) ;
reverseString(["h","e","l","l","o"]); //outputs string olleh
但是字符串的长度很奇怪:
return (s.pop() + reverseString(s)).length ;
reverseString(["h","e","l","l","o"]); //outputs 2
答案 0 :(得分:1)
谢谢!我知道哪里出了错。 下面的代码有效:
var reverseString = function(s) {
if(s.length == 1) return s[0];
if(s.length > 1) {
return s.pop().split().concat(reverseString(s)); //all arrays and properly concatenated
}
}
P.S。当然,有很多方法可以反转数组,而这并不是最好的方法。)
答案 1 :(得分:0)
在返回输出时,(s.pop() + reverseString(s))
会返回字符串"eh"
,这就是为什么您看到长度为2的输出的原因。
此外,正如@Zlatko所提到的,如果您愿意的话,也可以简单地使用.reverse()
方法(如果您想取回字符串而不是反向数组,则可以添加.join("")
)
答案 2 :(得分:0)
function reverseString(str){
return str.split("").reverse().join("");
}
console.log(reverseString("this is my string"));
答案 3 :(得分:0)
您要在返回值中输入强制类型。
为什么不只使用['h', 'e', 'l', 'l', 'o'].reverse()
?这会立即反转数组。
但是,假设您要按照自己的方式进行操作。
对于一个方法,您的方法采用一个数组并返回一个字符串。这意味着递归将无法正常工作,因为有时它将获得不同类型的参数。
这是什么情况(我将其缩短为3个字符,它开始失败):
当前状态:我们在这里继续使用l
(s.pop()
)。我们称reverseString(['h', 'e'])
;
当前状态:
l
。e
(来自新s.pop()
)当前状态:
l
。e
h
作为字符串。'e'
和数组['h']
为什么要使用该数组?因为我们在末尾添加了.split()
。
因此在JavaScript中,添加'e' + ['h']
会给我们'eh'。
仍然很好,但是是偶然的。
l
(从第1步开始)与拆分“ eh”时得到的数组(意味着:'l' + 'eh'.split('')
,加到'le,h'
中)加在一起。 / h2>
如果执行更多步骤,则会获得更多的意外拆分。因此,请注意进行拆分或仅使用Array.reverse()。
答案 4 :(得分:0)
您正在进行递归调用,例如,这是尝试使用["b", "y", "e"]
来获取长度时使用return (s.pop() + reverseString(s)).length;
作为输入的顺序。
reverseString(["b","y","e"]) =>
return ("e" + reverseString(["b","y"]).length =>
return ("e" + return ("y" + reverseString(["b"])).length ).length =>
(*) return ("e" + return ("y" + "b").length ).length =>
(*) return ("e" + return 2).length =>
return ("e" + 2).length =>
return ("e2").length =>
return 2
尤其要注意到达end condition
(标有(*)
的行)会发生什么。这就是为什么您将2
作为输出的原因。如果要获取最终反向字符串的长度,只需在反向数组后访问它即可:
let reverseString = function(s)
{
if (s.length <= 1) return s[0];
return s.pop() + reverseString(s);
}
console.log("reversed:", reverseString(["h","e","l","l","o"]));
console.log("length:", reverseString(["h","e","l","l","o"]).length);
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
无论如何,请注意,您可以使用一种Array.reverse()方法:
let reverseString = function(s)
{
return s.slice().reverse().join("");
}
console.log("reversed:", reverseString(["h","e","l","l","o"]));
.as-console {background-color:black !important; color:lime;}
.as-console-wrapper {max-height:100% !important; top:0;}
在这里,Array.slice()用于避免input
的突变,因为:
reverse()
方法将数组反转。第一个数组元素成为最后一个,最后一个数组元素成为第一个。