2017-04-06 45 views
-2

我正在学习递归以及堆栈如何工作。我无法理解此函数中的堆栈跟踪,以及为什么我的console.log语句说明它们的功能;了解递归函数中的堆栈跟踪

function expoRecursion(base, exp) { 
    debugger; 
    if(exp == 1) { 
    console.log('the exp value is ' + exp + ' , base is returned'); 
    return base; 
    } else { 
    console.log('line 278 the function evaluates ' + expoRecursion(base, exp -1)); 
    return base * expoRecursion(base, exp-1); 
    } 
} 
expoRecursion(2,3); 

我已经在Chrome浏览器开发工具来运行这一点,并通过它加强,但似乎无法得到的,为什么当exp为1返回基本情况后的性质,我们弹出expoRecursion(2,2 -1),然后进入expoRecursion(2,3-1),然后再添加到堆栈expoRecursion(2,2-1),当它已经被评估了?随后的混乱似乎是来自他们看了我的日志语句:

the exp value is 1 , base is returned 
line 278 the function evaluates 2 
the exp value is 1 , base is returned 
line 278 the function evaluates 4 
the exp value is 1 , base is returned 
line 278 the function evaluates 2 
the exp value is 1 , base is returned 

为什么是最后一条语句2,然后最终返回值回来为8?

+1

你正在通过调用'expoRecursion'函数来记录它的结果来创建新的递归'console.log('expoRecursion(base,exp -1));' – Titus

+1

你的日志语句和你的return语句都是调用递归。这可能不是你想要的。 – pvg

+0

哦废话,我没有意识到我在console.log语句中调用函数agin。 –

回答

1

其他人已经指出你的困惑的基础:你在其他条款中重复发生了两次。我认为这将清理你:复发只有一次,保存结果,并在这两个地方使用

} else { 
    recur_result = expoRecursion(base, exp -1); 
    console.log('line 278 the function evaluates ' + recur_result); 
    return base * recur_result; 
} 

看看是否符合您的期望。

+0

了解,我看到了我的错误以及增加了我的困惑。 –