JavaScript递归反转字符串

5
我下面尝试了递归字符串翻转:
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,这样它就不会被设置为空字符串了吗?这段代码接近正确吗?

编辑:出于好奇心,我试图不使用使其变得非常容易的函数(例如reverse())。


我不明白你想用那个 results 数组做什么。尝试编写一段没有任何数组的代码,只使用字符串切片和连接。 - Bergi
我最初使用while循环完成了这个任务。但是我现在学到了一个知识点,即不能像普通函数一样在递归函数中声明变量。 - Rico
你可以使用内部函数来实现这个功能 - 在实际的递归函数外声明“results”,它将取代while循环的部分(并在“j”上进行递归); 但我认为这不是你练习的重点。 - Bergi
1个回答

6

你代码中的问题在于每次都省略了最后一个字符,并在最后一次递归调用中返回空字符串。

相反,获取字符串的最后一个字符,并将其与剩余字符串的反转值连接起来。

你可以这样实现:

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"

1
或者更简单的方法是 reverse(str.slice(1)) + str[0] :-) - Bergi
1
@Bergi 当然,但我认为如果我使用他原来的代码结构,他会更容易理解 :) - thefourtheye

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接