2013-11-03 53 views
0

我想用foo2(非resourse)替換我的函數foo,但foo2工作不正確。 foo2有什麼不對?用Python中的循環重寫遞歸函數

def foo(n, k=0,s=0): 
    if k < n: 
     for i in xrange(k==0,10): 
      foo(n, k+1, 10*s + i) 
    else: 
     print s, 

def foo2(n): 
    s=0 
    for k in xrange(n): 
     st = s 
     for i in xrange(k==0, 10): 
      st = 10* st + i 
     print st 
foo(3) 
foo2(3) 

更新

如果我更換10*s + is + i**3,我該如何改寫呢?

+1

'foo'做了什麼? – 2013-11-03 13:58:15

回答

3

foo打印10 n-1個〜10 Ñ -1;迭代xrange(10**(n-1), 10**n)

def foo2(n): 
    for s in xrange(10**(n-1), 10**n): 
     print s, 

以下是使用堆棧的遞歸功能可按的翻譯:

def foo2(n): 
    stack = [(0, 0)] # corresponding to (..., k=0, s=0) 
    while stack: 
     k, s = stack.pop(0) 
     if k < n: 
      for i in xrange(k==0, 10): 
       stack.append((k+1, 10*s + i)) 
     else: 
      print s, 

注意要嚴格執行相當於迭代版本,你也應該推迭代器(xrange...);循環中一次僅消耗一個項目。