Scheme到Python:最优雅的递归过程翻译是什么?
我最近又读了一遍《简单方案》这本书中关于递归的精彩介绍(这里有个链接,可以看到相关章节),书中介绍了一个递归过程(用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']
这可能和你预想的结果不一样。