请解释这个递归 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]
有人可以为我澄清一下吗?
函数的本质如下:
- 取第二个字符到最后一个字符的子串
- 递归应用反向函数
- 取第一个字符并将其附加到递归调用结果的末尾
- 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'
希望对您有所帮助!
我今天早上参加了 codewars,这个 Kata 要求一个函数来反转通过递归方法作为参数传递的字符串。
为此问题列出的最佳解决方案是这个。
function reverse(str) {
return str.length > 1 ? reverse(str.slice(1)) + str[0] : str;
}
我整个上午都在研究这个,但我仍然不知道这里发生了什么:
+ str[0]
有人可以为我澄清一下吗?
函数的本质如下:
- 取第二个字符到最后一个字符的子串
- 递归应用反向函数
- 取第一个字符并将其附加到递归调用结果的末尾
- 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'
希望对您有所帮助!