递归函数的复杂度高于非递归函数的说法是不太准确的…一般只说递归函数的常数比较大…
使用递归的最大的好处就是代码简洁…
(其实一切递归函数都可以用自己写一个栈模拟来转化为非递归)
对分治的复杂度来说,并不会有什么影响…当然也只是常数比非递归大一点,但是写起来方便很多。
(上面是对于递归函数和非递归函数的分析)
(下面是对于递归算法和递推算法的分析)
需要注意的是,如果出现冗余计算,递归的复杂度就真的会变高了,而递推就比较少出现冗余。
举个例子就是斐波那契数列的递推方法和递归方法的区别,如果用递归,会导致同一个位置的值多次被计算,
而计算的代价是很高的,因为下面每层都会产生大量冗余计算。
这种时候可以使用一个办法存储已经计算出的值,避免重复计算,也就是记忆化。
记忆化之后,保证不出现冗余计算,所以递归计算的复杂度和递推是一样的。
而在一些特殊情况下,递归的记忆化搜索甚至比递推要快,这种情况就是需要计算的问题比较离散的时候,
这时递推往往计算出很多不需要的位置,而记忆化搜索只计算了需要的位置。