2013-12-09 60 views
0
def algae(S, n): 
    """ 
    Print S rewritten with the algae rule to recursion depth n 
    """ 
    al = {'A': 'AB', 'B': 'A'} 
    # Base case 
    if n == 0: 
     return S 
    # Transform each symbol in S 
    for symbol in S: 
     S += algae(al[symbol], n - 1) 

print(algae('A', 5)) 

嗨,任何人都可以解释为什么打印该功能的我接收到错误的结果时:递归返回

TypeError: Can't convert 'NoneType' object to str implicitly 

这是指第11行(S + =藻类(人[符号] ,n - 1))

+1

如果n!= 0,你的函数没有返回。这就是为什么你得到一个'NoneType'错误。你马上就打电话给藻类(x,4),它不会返回任何东西。 –

回答

3

编辑:

这是你的脚本的一个工作版本:

def algae(S, n): 
    """ 
    Print S rewritten with the algae rule to recursion depth n 
    """ 
    al = {'A': 'AB', 'B': 'A'} 
    if n == 0: 
     return S 
    # Make a new string to build on 
    mystr = "" 
    for symbol in S: 
     # Add the translation to the new string 
     mystr += al[symbol] 
    # Recursively call the function, passing in the string 
    return algae(mystr, n-1) 

print(algae('A', 5)) 

输出:

ABAABABAABAAB 

注意:如果你愿意,你可以使这个@Blckknght说:

def algae(S, n): 
    """ 
    Print S rewritten with the algae rule to recursion depth n 
    """ 
    al = {'A': 'AB', 'B': 'A'} 
    if n == 0: 
     return S 
    mystr = "".join(al[c] for c in S) 
    return algae(mystr, n-1) 

print(algae('A', 5)) 
+0

感谢您的回答,输出应该是事实上的:'ABAABABAABAAB'还有什么不对? –

+0

@ user2850514 - 是的,你的算法有点不合适。看我的编辑。 – iCodez

+0

请注意,创建新字符串的更多“Pytonic”方式应该是'mystr =“”.join(对于S中的c)[al] [c]'。字符串是不可变的,所以你对它们做的每一个'+ ='都需要整个字符串的一个拷贝,如果字符串变长,这个拷贝可能非常慢。 CPython有一些特殊的优化可以让它在某些时候更快,但是你不应该依赖那个实现特定的行为。 – Blckknght

3

n != 0,你的代码落在函数的末尾。在Python中,这相当于返回None。您需要为递归情况添加return语句。

+0

添加'return'会返回一些内容,但不幸的是不会写入内容。我已将它添加到循环外部的'S + = algae(al [symbol],n - 1)'之下。 –

+0

@ user2850514:对不起,我的意思是你必须返回* *(可能是'S')。一个空的'return'也返回'None'。 –

0

n不为0的情况下,algae从未return什么事,所以Python隐含给它的None返回值。接下来algae调用然后试图做S += None,因为这样会产生错误。将return S添加到您的函数的末尾以解决此问题。

0

您在功能末尾缺少“return S”。

0

工作版本没有递归(从来不喜欢递归)

def algae(S, n): 
    al = {'A': 'AB', 'B': 'A'} 
    for i in range(n): 
     newS = '' 
     for i in range(len(S)): 
      newS += al[S[i]] 
     S = newS 
    return S 

print(algae('A', 5)) 
+0

我不确定(所以你的答案是有效的),但我认为OP需要使用递归,因为这是一个学校作业。 – iCodez

+0

不一定是一项任务,但我现在正在进行一个基于个人递归的项目,并且在这方面遇到麻烦。 –