请解释这个递归 javascript 函数

Please explain this recursive javascript function

我今天早上参加了 codewars,这个 Kata 要求一个函数来反转通过递归方法作为参数传递的字符串。

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

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

我整个上午都在研究这个,但我仍然不知道这里发生了什么:

+ str[0]

有人可以为我澄清一下吗?

函数的本质如下:

  1. 取第二个字符到最后一个字符的子串
  2. 递归应用反向函数
  3. 取第一个字符并将其附加到递归调用结果的末尾
  4. Return结果

这将导致以下逻辑,括号中指示的(递归)函数调用:

(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)

str.slice(1) "chops off" 字符串的第一个字母和 returns 其余部分。所以 'abcd'.slice(1) 给你 'bcd'.

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

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

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

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

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

我会尝试以更"human-readable"的方式重写函数

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'

希望对您有所帮助!