如何将这个string.length的值多字符化为2?

时间:2019-05-19 19:26:48

标签: javascript

我试图使用递归函数来反转数组。 使用参数[“ 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

5 个答案:

答案 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个字符,它开始失败):

步骤1:输入['h','e',l']。

当前状态:我们在这里继续使用ls.pop())。我们称reverseString(['h', 'e']);

步骤2:我们输入['h','e']

当前状态:

  • 外部函数仍然保留l
  • 新功能现在包含e(来自新s.pop()

第3步,我们输入['h']

当前状态:

  • 外部功能(第1步)仍然保留l
  • 第2步函数保存e
  • 第三个函数返回h作为字符串。

步骤4:将两个参数加在一起:字符串'e'和数组['h']

为什么要使用该数组?因为我们在末尾添加了.split()

因此在JavaScript中,添加'e' + ['h']会给我们'eh'。

仍然很好,但是是偶然的。

第5步:将字符串l(从第1步开始)与拆分“ eh”时得到的数组(意味着:'l' + 'eh'.split(''),加到'le,h'中)加在一起。 / h2>

第6步:立即返回字符串的拆分。

如果执行更多步骤,则会获得更多的意外拆分。因此,请注意进行拆分或仅使用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()方法将数组反转。第一个数组元素成为最后一个,最后一个数组元素成为第一个。