递归函数如何返回值?

3
function reverse(str){
    if(str.length <= 1) {
        return str;
    } 
    return reverse(str.slice(1)) + str[0];
}

console.log(reverse("two"))

当最后一个return str语句在if语句内部触发时,它返回'o'。然而,在if语句外面还有一个额外的 + str[0]。难道它不应该返回'oo'而不是'o'吗?
该函数完全正常工作,但当我尝试进行可视化时,我会感到困惑。
3个回答

3
代码的视觉表现。 这里输入图片描述

1
谢谢您提供如此美丽的表述... 是有史以来最好的解释.. 谢谢。 - gyan mishra

2

只有当字符串长度小于或等于1时,它才会进入if分支。

例如:str = "o",那么它将进入该分支。

if(str.length <= 1) {
    return str; //here your function will return the answer to main() and will exit this function
} 

输出

o

因为你写了return str,它会立即从该函数返回,并不执行任何后续的代码行。所以它不会执行这段代码:

return reverse(str.slice(1)) + str[0]; //this part will never be reached

仅当 str len>=2 时,以上部分才会执行。


现在让我们了解递归堆栈。

str  =  "two"


这是递归的工作原理 -
reverse(two) = reverse(wo)+ t = reverse(o)+ wt = o+wt = owt

注意:当字符串长度为1时,reverse(o)将简单地返回o


1
这是函数内部行为顺序的发生方式:
  1. 调用reverse('two')
  2. reverse('two') 调用 reverse(str.slice(1)),它将求值为调用 reverse('wo')
  3. reverse('wo') 调用 reverse(str.slice(1)),它将求值为调用 reverse('o')
  4. if(str.length <= 1) 求值为 truereverse('o') 调用返回 'o' 给调用者
  5. reverse('wo') 调用返回 'ow' 给调用者(str[0]'w'
  6. reverse('two') 调用返回 'owt' 给调用者(str[0]'t'

最终结果是预期的 'owt'

因此,在

return reverse(str.slice(1)) + str[0];

str[0]不会被添加到reverse(str.slice(1))中,直到函数调用返回。当它返回时,str[0]的值将是在调用reverse(str.slice(1))时的值。

if语句满足并评估为true时,它立即退出当前函数调用,并将值'o'返回给调用者,因为if内部有一个返回语句。

if(str.length <= 1) {
    return str;       // <-- exits here and returns 'o'
}

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