尾递归笔记
1.普通递归
是在每次fact(n-1)时开辟一块栈内存存放之前的计算结果。
特点是空间占据量随时间增长。
o(n)的空间。
2.尾递归
是在每次fact(num-1,num*product)一次就已经把结果算出来了,这样就在需要开辟新栈时只要把旧的栈覆盖即可,因为计算结果已经有了。
特点是只需要占用一个函数栈。
o(1)空间。
当然了,是不是每次都只用一个栈空间还是看语言的编译器支不支持尾递归优化的。支持优化的话就像上文说的,新的函数栈覆盖旧的就达到了o(1)的目的,但是若编译器不支持优化,那么每次同样会去开辟一个新的函数栈空间,那么还是o(n)的空间。