2016-02-23 63 views
1

我正在使用遞歸來反轉字符串。我能夠使用以下代碼成功反轉字符串。使用字符串反轉函數的奇怪行爲

def rev(string): 
    if len(string)==0: 
     return string 
    if len(string)==1: 
     return string 
    else: 
     s=string 

     string = s[-1]+rev(s[:-1]) 

    return string  

但是,當我與打印它只是打印答案的前兩個字符,然後拋出一個錯誤說

"TypeError: cannot concatenate 'str' and 'NoneType' objects"

實例替換回報。當給予「StackOverflow的」的功能,返回返回「wolfrevOkcatS」 corrrectly 但是當我試圖打印功能本身的答案,它只是打印「TS」給上述錯誤的值。

+0

簡短回答:不要試圖在遞歸函數中打印結果。返回結果並將其打印在調用代碼中。 –

回答

2

我懷疑你做了這樣的事情:

def rev(string): 
    if len(string)==0: 
     print string 
    if len(string)==1: 
     print string 
    else: 
     s=string 

     string = s[-1]+rev(s[:-1]) 

    print string 

讓我們正確的問題。假設您嘗試顛倒的字符串是abc。在第一次通話時,您會打else子句,並嘗試評價:

'c' + rev('ab') 

的問題是現在你的函數沒有return語句,rev('ab')返回None。當你試圖連接一個字符串與無法時,python引發錯誤。

用返回語句。 rev('ab')返回'ba',加號可用於連接'c''ba'。另外,如果您試圖在生產代碼中解決這個問題,您應該使用內置工具。

reversed_str = myStr[::-1] 
reversed_str_iterator = reversed(myStr) 
1

要反轉string/listPython使用list[::-1]

演示

>>> my_str = 'StackOverflow' 
>>> my_str[::-1] 
'wolfrevOkcatS' 
+1

雖然這是真的,但OP似乎試圖理解遞歸,而不是解決反轉字符串的具體問題。你也在這裏展示了可怕的形式,命名了一個變量'str',從而映射了內建的'str'構造函數。 – ShadowRanger

1

如果您與print更換return,你的函數將不會返回任何東西。在Python中,這與返回None相同。這將打破遞歸步驟,將字符串的最後一個字母與遞歸調用的返回值連接起來。相反,你應該讓遞歸調用做自己的打印(只叫它),打印後,在一個單獨的聲明中的最後一個字母:

else: 
    print(s[-1], end="") # or print s[-1], (with the comma!) if you're on Python 2 
    rev(s[:-1]) 

請注意,您可能需要您的基本情況打印在這個換行符情況,因爲否則你不會得到一個。

1

如果您不是return函數,則函數隱式返回None。通過用print替換return,可以中斷遞歸功能;它會遞歸,但遞歸調用中計算的值不會被返回並被使用。如果你想print中間結果爲你自己造就,請這樣做,但這樣做只是之前每個return聲明,而不是代替return聲明。