我今天早上参加了代码大战,而且这个Kata要求函数通过递归方法反转作为参数传递的字符串。
此问题列出的最佳解决方案是。
function reverse(str) {
return str.length > 1 ? reverse(str.slice(1)) + str[0] : str;
}
今天早上我研究了这一切,我仍然不知道这里发生了什么:
+ str[0]
有人可以帮我解释一下吗?
答案 0 :(得分:2)
该功能的本质如下:
这导致以下逻辑,括号表示的(递归)函数调用:
(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