我最近再次阅读了“简单方案”一书中的美丽介绍(这里是相关章节的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中表示这个递归过程?或者更“优雅”的方式?
答案 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)