请解释这个递归javascript函数
今天早上我在codewars中,有一个Kata请求一个函数来反转通过递归方法作为参数传递的字符串 针对这个问题列出的最佳解决方案是这样的请解释这个递归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] 有人能帮我澄清一下吗?函数的本质如下: 从第二个字符到最后一个字符取子字符串 递归地应用反
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'