我尝试过下面的递归字符串反转:
function reverse(str){
var results =[];
var j =0;
if(str.length === 0){
console.log('this is zero, yo');
return results.join('');
}
results[j] = str[str.length -1];
console.log('results: ' + results);
j++;
var next = str.substring(0,str.length -1);
console.log(next);
return reverse(next);
}
try{
console.log('***');
console.log(reverse('testing'));
}
catch(e){
console.log('blew the stack');
}
不幸的是,上次函数运行时,结果被设置为空字符串。我应该创建一个返回results
的内部函数,所以它不能设置为空字符串吗?这段代码关闭了吗?
编辑:这是出于好奇心,我试图不使用那些让它变得非常容易的功能(反向())
答案 0 :(得分:3)
代码中的问题是,每次都省略最后一个字符,并在最后一次递归调用中返回空字符串。
相反,获取字符串的最后一个字符并附加字符串其余部分的反转值。
你可以像这样实现它
function reverse(str) {
if (str.length === 0) {
return "";
}
return str[str.length - 1] + reverse(str.substring(0, str.length - 1));
}
此处,reverse("abc")
将按此评估
"c" + reverse("ab")
"c" + ("b" + reverse("a"))
"c" + ("b" + ("a" + reverse(""))) // Hits the `base condition` of recursion
"c" + ("b" + ("a" + "")) // Unwinding begins here
"c" + ("ba")
"cba"