2011-03-14 37 views
2

我最近又看了美丽的介绍到递归在“简单计划”的书(这里的link相关章节),在引入这个递归过程(在方案语言):Scheme to Python:递归过程最优雅的翻译?

(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

我刚刚注意到''downup'在你的例子中的字母结尾,而'recursivefun'从前面截断了字母。这是不同的故意吗? – Davy8 2011-03-14 15:05:11

回答

4

如果要密切代表原始递归函数方案:

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'] 

这可能是从您所期望的不同。

+0

+1帮助我了解Scheme版本(也只是一个整体优雅的解决方案) – Davy8 2011-03-14 15:02:11

+0

非常感谢您指出的内容非常有用! btw在你的'翻译'上面你用's'和'word'来表示相同的变量..你可能想改变它! – magicrebirth 2011-03-14 15:05:23

+0

@magicrebirth:谢谢,修正。 – 2011-03-14 15:08:50

2

重构:

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

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

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 
0

而只是对比它在列表理解:

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

== >