<script type="text/javascript">
function text(n){
if(n===1){
return 1;
}
return n*text(n-1);
}
alert(text(4))
</script>
关于这个递归函数,return
后面n*text(n-1)
,怎么转换为n*3
....?希望高手能帮忙分析下过程,想了很久没想明白..
update
:根据大家的回答,我想了想,尝试着分析了一下过程,是不是如图所示那样进行相乘的?
首先你要知道有一种数据结构叫做 栈(stack):重点是先进后出(FILO)
接着你要知道函数执行是通过一个函数栈:简单来说就是执行一个函数时,将其压栈,这个函数又调用一个函数,就把新函数再次压栈。
本题的执行情况就是,首先执行 text(4),被放入栈底,在 return 的时候又调用了 text(3),也被压栈(放在 text(4) 上面)。而 text(3) 在执行的时候又会压入 text(2)...
直到最后的退出条件 n === 1 成立,即 text(1) return 1,这时开始出栈。
text(1) 首先出栈,接着是 text(2) 获得了 text(1) 的结果 1 之后,return 2*1; 接着出栈。
如上所述,依次执行出栈,最后栈底的 text(4) return 了 4*text(3)的 return 值返回,执行完成。
这个最终结果return的是n (n-1) (n-1-1) * ... 1这样啊
每次递归的时候都递减了1,就是说,当你传入的值是4的话,返回的是4×text(3)然后继续调用
仅仅考虑代码如何执行的。
如果text(4)
不好理解。可以从
text(1) --> 1 这个就很好理解
text(2) --> 2 text(1) 因为text(1) = 1, 所以 text(2) = 2 1 = 2;
text(3) --> 3 text(2) .... ---> 3 2 = 6;
text(4) --> 4 text(3) .... ---> 4 6 = 24;
下一步骤的结果需要用到上一步的结果。 比如求 text(4) 需要用 text(3) * 4 。