玩过俄罗斯套娃没
假设调用调用f(n)是打开娃,return是关上娃。
n最后等于1时 return 1是套上最小的那个娃 而不是把所有娃都盖起来。
每次调用f(n) 他们是独立开来的 而不是在一个函数里面。
就是一个递归呀,当n不等于一的时候,它内部继续调用fn,return的是n*fn(n-1),要return得先知道fn(n-1)的值哇,此时又会去执行fn(n-1),一直递归到参数n=1,然后又开始回溯!
有帮助的话采纳一下哦!
你说的是哪个return不会打断函数的执行?return 1还是return n*fn(n-1)?
前者return 1是打断了,后者return n**fn(n-1)是return里又调用了fn(n-1),得fn(n-1)返回了才会打断,然后fn(n-1)里又调用了fn(n-1-1),反复直到return 1后才返回。
哎呀,脑阔子好疼
fn(5)调用递归函数,return值依次为:5 * fn(4)、5 * 4 * fn(3)、5 * 4 * 3 * fn(2)、5 * 4 * 3 * 2 * fn(1)、5 * 4 * 3 * 2 * 1,return 1 只是在最后一步打断函数并返回给最后一层递归中的调用,而不是直接返回给fn(5)
你这个是递归调用会返回5,4,3,2到1的时候截止输出
把递归改成顺序执行走一遍就了解了
递归的过程可以分为“递”和“归”,例如以下是求6的阶乘即f(6)的过程。
递归改成顺序执行
你没发现你执行了好几个fn()函数,每执行一个就创建一个函数对象,fn(1) 对应的对象结束的只是他自己的函数对象
不会影响到其他的函数对象
这个是递归函数 return=1是函数的结束标准 还会回溯回去
return n * fn(n-1); <=> var result = n * fn(n-1); return result;