请解释这个递归的javascript函数

时间:2016-08-29 19:40:14

标签: javascript recursion conditional-operator

我今天早上参加了代码大战,而且这个Kata要求函数通过递归方法反转作为参数传递的字符串。

此问题列出的最佳解决方案是。

function reverse(str) {
    return str.length > 1 ? reverse(str.slice(1)) + str[0] : str;
}

今天早上我研究了这一切,我仍然不知道这里发生了什么:

+ str[0]

有人可以帮我解释一下吗?

4 个答案:

答案 0 :(得分:2)

该功能的本质如下:

  1. 将第二个字符的子字符串带到最后一个字符
  2. 递归应用反向函数
  3. 取第一个字符并将其附加到递归调用结果的末尾
  4. 返回结果
  5. 这导致以下逻辑,括号表示的(递归)函数调用:

    (A B C D E)
    ((B C D E) A)
    (((C D E) B) A)
    ((((D E) C) B) A)
    (((((E) D) C) B) A)
    

答案 1 :(得分:1)

str.slice(1)"砍掉"字符串的第一个字母并返回其余部分。因此'abcd'.slice(1)会为您提供'bcd'

str[0]是字符串的第一个字母。 'abcd'[0]'a'

所以,str.slice(1) + str[0]取字符串的第一个字母,"移动"它到最后:'abcd'变为'bcda'

这不能解决解决方案的递归性质,但它会回答您关于+ str[0]的问题。

答案 2 :(得分:1)

我会尝试以更“人类可读”的方式重写该功能

reverse = str => {

    // If there is still string to reverse
    if (str.length > 1) {
        let firstChar = str[0]
        let strWithoutFirstChar = str.slice(1)

        // Notice only a part of the string 'comes back' here
        // console.log(strWithoutFirstChar) // Might help
        return reverse(strWithoutFirstChar) + firstChar
    }

    // Else return result as is
    else {
        return str
    }

}

这是相同的功能,但没有三元组并声明命名良好的变量。

如果您取消注释console.log()行并致电:

reverse('help');

输出应为:

elp
lp
p
'pleh'

希望它有所帮助!

答案 3 :(得分:0)

+运算符是字符串的连接符。 你可以改为使用concat:

var reverse = str => str.length > 1 ? reverse(str.slice(1)).concat(str[0]) : str;
console.log(reverse("123456789")); // 987654321