有人可以解释双递归python吗?

时间:2014-12-03 22:43:01

标签: python recursion

我试图理解双递归,但我没有到达任何地方。

def f(s):
    if len(s) <= 1:
        return s
    return f(s[1:]) + s[0]
print f('world')
  
    
      

dlrow

    
  

如果正确,上面的代码将执行以下操作:

  1. f(s [1:])+ s [0] ==&gt; f(orld)+ w
  2. f(s [1:])+ s [0] ==&gt; f(rld)+ o
  3. f(s [1:])+ s [0] ==&gt; f(ld)+ r
  4. f(s [1:])+ s [0] ==&gt; f(d)+ l&lt; ==这里len(s)== 1所以s = d,
  5. 然后:

    1. d + l = dl
    2. dl + r = dlr
    3. dlr + o = dlro
    4. dlro + w =​​ dlrow
    5. 所以dlrow将如上所示打印。

      当你进行双递归时,我无法理解代码:

      def f(s):
          if len(s) <= 1:
              return s
          else:
              return f(f(s[1:])) + s[0] #Note double recursion
      print f('world')
      

      有人可以向我解释这个双递归是如何工作的吗?

2 个答案:

答案 0 :(得分:4)

这是一种检测递归代码的简便方法

import inspect

def f(s):
    print "  " * (len(inspect.stack())-2), '>>', s
    if len(s) <= 1:
        print "  " * (len(inspect.stack())-2), '<<', s
        return s
    else:
        retval = f(f(s[1:])) + s[0] #Note double recursion
        print "  " * (len(inspect.stack())-2), '<<', retval
        return retval


print f('world')

打印

 >> world
   >> orld
     >> rld
       >> ld
         >> d
         << d
         >> d
         << d
       << dl
       >> dl
         >> l
         << l
         >> l
         << l
       << ld
     << ldr
     >> ldr
       >> dr
         >> r
         << r
         >> r
         << r
       << rd
       >> rd
         >> d
         << d
         >> d
         << d
       << dr
     << drl
   << drlo
   >> drlo
     >> rlo
       >> lo
         >> o
         << o
         >> o
         << o
       << ol
       >> ol
         >> l
         << l
         >> l
         << l
       << lo
     << lor
     >> lor
       >> or
         >> r
         << r
         >> r
         << r
       << ro
       >> ro
         >> o
         << o
         >> o
         << o
       << or
     << orl
   << orld
 << orldw
orldw

答案 1 :(得分:0)

2019年,使用在线编译器,例如www.onlinegdb.com/online_python_compiler, 上面的打印行不起作用。这是工作代码:

import inspect 

def f(s):
   print("  " * (len(inspect.stack())-2), '>>', s)
   if len(s) <= 1:
      print( "  " * (len(inspect.stack())-2), '<<', s)
      return s
   else:
      retval = f(f(s[1:])) + s[0] #Note double recursion
      print( "  " * (len(inspect.stack())-2), '<<', retval)
      return retval 


print(f('world'))