请解释这个递归javascript函数

请解释这个递归javascript函数,javascript,recursion,conditional-operator,Javascript,Recursion,Conditional Operator,今天早上我在codewars中,有一个Kata请求一个函数来反转通过递归方法作为参数传递的字符串 针对这个问题列出的最佳解决方案是这样的 function reverse(str) { return str.length > 1 ? reverse(str.slice(1)) + str[0] : str; } 我整个上午都在研究这个问题,但我仍然不知道这里发生了什么: + str[0] 有人能帮我澄清一下吗?函数的本质如下: 从第二个字符到最后一个字符取子字符串 递归地应用反

今天早上我在codewars中,有一个Kata请求一个函数来反转通过递归方法作为参数传递的字符串

针对这个问题列出的最佳解决方案是这样的

function reverse(str) {
    return str.length > 1 ? reverse(str.slice(1)) + str[0] : str;
}
我整个上午都在研究这个问题,但我仍然不知道这里发生了什么:

+ str[0]

有人能帮我澄清一下吗?

函数的本质如下:

  • 从第二个字符到最后一个字符取子字符串
  • 递归地应用反向函数
  • 获取第一个字符并将其附加到递归调用结果的末尾
  • 返回结果

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

    (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)
    “切掉”字符串的第一个字母并返回其剩余部分。所以
    'abcd'。切片(1)
    为您提供
    'bcd'

    str[0]
    是字符串的第一个字母<代码>'abcd'[0]是
    'a'

    因此,
    str.slice(1)+str[0]
    取字符串的第一个字母并将其“移动”到末尾:
    'abcd'
    变为
    'bcda'


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

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

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

    我将尝试以一种更“人类可读”的方式重写函数

    这是同一个函数,但没有三元组和声明命名良好的变量

    如果取消注释
    console.log()
    行并调用:

    reverse('help');
    
    输出应为:

    elp
    lp
    p
    'pleh'
    

    希望有帮助

    我假设“最佳解决方案”是指最佳递归解决方案?我怀疑这是反转字符串的有效方法。这是一个糟糕的解决方案,因为递归调用不在尾部位置。尝试将函数转换为尾部递归版本,以更好地理解主题。提示:累加器传球风格。谢谢,现在有意义了!
    elp
    lp
    p
    'pleh'