Python的方案:最优雅的递归过程翻译?

时间:2011-03-14 14:51:10

标签: python recursion scheme

我最近再次阅读了“简单方案”一书中的美丽介绍(这里是相关章节的link),其中介绍了这种递归过程(在方案中语言):

(define (downup wd)
  (if (= (count wd) 1)
      (se wd)
      (se wd (downup (bl wd)) wd)))

> (downup 'toe)
(TOE TO T TO TOE)

> (downup 'banana)
(BANANA BANAN BANA BAN BA B BA BAN BANA BANAN BANANA)

我尝试将该程序转换为 python ,我在日常工作中使用它。结果如下:

def recursivefun(word):
    if len(word) == 1: 
        return word
    else:
        x = []
        x.append(word)
        x.extend(recursivefun(word[1:]))
        x.append(word)
        return x

print recursivefun("ciao")
# ==> ['ciao', 'iao', 'ao', 'o', 'ao', 'iao', 'ciao']

所以我的问题是:有没有更好的方法在python中表示这个递归过程?或者更“优雅”的方式?

4 个答案:

答案 0 :(得分:4)

如果要密切代表原始的递归Scheme函数:

def downup(word):
    if len(word) <= 1:
        return [word]
    return [word] + downup(s[1:]) + [word]

请注意,如果传入的字符串的长度为1,则您自己的函数返回一个字符串,否则返回一个列表。这可能会导致令人惊讶的行为。尝试

def recursivefun(word):
    if len(word) == 2:
        return word
    else:
        x = []
        x.append(word)
        x.extend(recursivefun(word[1:]))
        x.append(word)
        return x

print recursivefun("banana")
例如,

打印

['banana', 'anana', 'nana', 'ana', 'n', 'a', 'ana', 'nana', 'anana', 'banana']

可能与您的预期不同。

答案 1 :(得分:2)

重构:

def recursivefun(word):
  if len(word) == 1: 
    return [word]
  else:
    return [word] + recursivefun(word[1:]) + [word]

请记住,我们必须在第一个分支中返回[word],因为当您在第5行连接recursivefun()时,它需要一个列表。

答案 2 :(得分:1)

可以使用字符串而不是列表:

def downup(wd):
    if len(wd) == 1:
        return wd

    return ' '.join([wd, downup(wd[:-1]), wd])

print downup("TOE")
print downup("BANANA")

打印

TOE TO T TO TOE
BANANA BANAN BANA BAN BA B BA BAN BANA BANAN BANANA

答案 3 :(得分:0)

只是为了在列表理解中进行比较:

w ='BANANA'
print('('+' '.join(w[:n] for n in list(range(len(w)+1,1,-1)) + list(range(1,len(w)+1)))+')')

==&GT;

(BANANA BANAN BANA BAN BA B BA BAN BANA BANAN BANANA)