Scheme到Python:递归过程最优雅的翻译?

Scheme到Python:递归过程最优雅的翻译?,python,recursion,scheme,Python,Recursion,Scheme,我最近在《简单方案》一书中再次阅读了递归的美丽介绍(这是相关章节的开头),其中介绍了递归过程(使用方案语言): 我试图将该过程翻译成python,我在日常工作中使用它。结果如下: def recursivefun(word): if len(word) == 1: return word else: x = [] x.append(word) x.extend(recursivefun(word[1:]))

我最近在《简单方案》一书中再次阅读了递归的美丽介绍(这是相关章节的开头),其中介绍了递归过程(使用方案语言):

我试图将该过程翻译成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来表示这个递归过程?或者是一种更“优雅”的方式?

如果您想更接近地表示原始递归方案函数:

def downup(word):
    if len(word) <= 1:
        return [word]
    return [word] + downup(s[1:]) + [word]
例如,哪个打印

['banana', 'anana', 'nana', 'ana', 'n', 'a', 'ana', 'nana', 'anana', 'banana']
这可能与您预期的不同。

重构:

def recursivefun(word):
  if len(word) == 1: 
    return [word]
  else:
    return [word] + recursivefun(word[1:]) + [word]
请记住,我们必须在第一个分支中返回[word],因为在第5行连接recursivefun()时,它需要一个列表。

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

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

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

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


(BANANA BANA BANA BANA BANA B BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BANA BAN!顺便说一句,在上面的“翻译”中,您使用了“s”和“word”来表示相同的变量。。你可能想改变这一点!我刚刚注意到,在您的示例中,
down-up
在结尾处切掉字母,而
recursivefun
从前面切掉字母。这种差异是故意的吗?
TOE TO T TO TOE
BANANA BANAN BANA BAN BA B BA BAN BANA BANAN BANANA
w ='BANANA'
print('('+' '.join(w[:n] for n in list(range(len(w)+1,1,-1)) + list(range(1,len(w)+1)))+')')