2013-11-03 24 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...);循环中一次仅消耗一个项目。