return返回值,这个return为什么不会打断函数的执行,而是继续返回值呢

img


return可以打断函数,最后执行到n=1 的时候 return1,这个return为什么不会打断函数的执行,而是继续返回值呢

玩过俄罗斯套娃没
假设调用调用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)的过程。

img


大致了解这些后,发现这里求5的阶乘f(5) 就好理解多了,return 1相当于最后的临界条件儿,当到1的时候,阶乘求到这里已经递了全部了,因此返回1,完成递归求解。

img


如有帮助,还请采纳!谢谢!

递归改成顺序执行

你没发现你执行了好几个fn()函数,每执行一个就创建一个函数对象,fn(1) 对应的对象结束的只是他自己的函数对象
不会影响到其他的函数对象

这个是递归函数 return=1是函数的结束标准 还会回溯回去

return n * fn(n-1); <=> var result = n * fn(n-1); return result;