回复内容:
所有的递归调用,都可以做CPS变换改写成尾递归形式,然后尾递归可以改写成循环:
def fact ( n ): if n == 0 : return 1 else : return n * fact ( n - 1 ) id = lambda x : x def factCPS ( n ): def f ( n , k ): if n == 0 : return k ( 1 ) else : return f ( n - 1 , lambda x : k ( n * x )) return f ( n , id ) def factNoRec ( n ): def factory ( n , k ): return lambda x : k ( n * x ) k = id while True : if n == 0 : return k ( 1 ) else : k = factory ( n , k ) n -= 1 def factHolyCrap ( n ): k = () while True : if n == 0 : x = 1 while k : x = k [ 0 ] * x k = k [ 1 ] return id ( x ) else : k = ( n , k ) n -= 1 if __name__ == '__main__' : print ([ f ( 5 ) for f in [ fact , factCPS , factNoRec , factHolyCrap ]])递归过程中需要维护一个调用栈
如果不想递归,硬是要循环,那么可以自己手动来维护这个调用栈
这样唯一的好处或许就是解除了最大递归深度的限制吧。。。 给邵大神补一个java sample
public class RecursionEliminationSample { int factorRec ( int n ) { if ( n == 0 ) return 1 ; else return n * factorRec ( n - 1 ); } int factor ( int n ) { Function Integer , Integer > k = ( x ) -> x ; while ( true ) { if ( n == 0 ) return k . apply ( 1 ); else { final Function Integer , Integer > k0 = k ; final int n0 = n ; k = ( x ) -> k0 . apply ( n0 * x ); n -= 1 ; } } } }用循环实现? 可以自己建个栈来保存状态。你只需要搞明白在递归的时候程序往栈上面放了些什么,然后用自己的栈模拟即可。
技巧上倒是可以参照从fortran时代积累的递归转迭代的技术。 不是完全没有解决方案:
Does Python optimize tail recursion? 时代积累的递归转迭代的技术。 然后用自己的栈模拟即可。 ,话j
查看更多关于Python哪些可以代替递归的算法?的详细内容...
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://www.haodehen.cn/did90072