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

2 投票
4 回答
879 浏览
提问于 2025-04-16 13:40

我最近又读了一遍《简单方案》这本书中关于递归的精彩介绍(这里有个链接,可以看到相关章节),书中介绍了一个递归过程(用scheme语言写的):

(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 个回答

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
2

重构后的代码:

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

请记住,我们在第一个分支中必须返回[word],因为在第5行调用recursivefun()时,它需要一个列表作为输入。

4

如果你想要和原来的递归Scheme函数非常相似:

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

注意,你自己写的函数如果传入的字符串长度是1,就会返回一个字符串;如果长度不是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']

这可能和你预想的结果不一样。

撰写回答