簡體   English   中英

Python 使用遞歸反轉字符串

[英]Python reversing a string using recursion

我想使用遞歸來反轉 python 中的字符串,以便它向后顯示字符(即“Hello”將變為“olleh”/“olleh”。

我寫了一個迭代地做的:

def Reverse( s ):
    result = ""
    n = 0
    start = 0
    while ( s[n:] != "" ):
        while ( s[n:] != "" and s[n] != ' ' ):
            n = n + 1
            result = s[ start: n ] + " " + result
            start = n
    return result

但是我究竟該如何遞歸地執行此操作? 我對這部分感到困惑,特別是因為我不太使用 python 和遞歸。

任何幫助,將不勝感激。

def rreverse(s):
    if s == "":
        return s
    else:
        return rreverse(s[1:]) + s[0]

(很少有人在 Python 中進行繁重的遞歸處理,該語言不是為它設計的。)

為了遞歸地解決一個問題,找到一個容易解決的瑣碎案例,並通過將問題分解成越來越簡單的版本來弄清楚如何解決這個瑣碎的案例。

您在反轉字符串時做的第一件事是什么? 字面上的第一件事? 你得到字符串的最后一個字符,對嗎?

因此,一個字符串的反向是最后一個字符,隨后的一切恰好相反,不過最后一個字符,這哪里是遞歸的用武之地。字符串的最后一個字符可以寫為x[-1]而一切,但最后字符是x[:-1]

現在,你如何“觸底反彈”? 也就是說,您可以在不使用遞歸的情況下解決的微不足道的情況是什么? 一個答案是一個字符串,它是相同的正向和反向。 所以如果你得到一個單字符的字符串,你就完成了。

但是空字符串更加瑣碎,實際上有人可能會將其傳遞給您的函數,因此我們可能應該改用它。 畢竟,一個單字符的字符串可以分解為最后一個字符和除最后一個字符以外的所有字符; 只是除了最后一個字符之外的所有內容都是空字符串。 所以如果我們通過返回它來處理空字符串,我們就設置好了。

把它們放在一起,你會得到:

def backward(text):
    if text == "":
        return text
    else:
        return text[-1] + backward(text[:-1])

或者在一行中:

backward = lambda t: t[-1] + backward(t[:-1]) if t else t

正如其他人指出的那樣,這不是您通常在 Python 中執行此操作的方式。 迭代解決方案會更快,而使用切片來做它會更快。

此外,Python 對堆棧大小施加了限制,並且沒有尾調用優化,因此遞歸解決方案將僅限於反轉只有大約一千個字符的字符串。 您可以增加 Python 的堆棧大小,但仍然存在固定限制,而其他解決方案始終可以處理任意長度的字符串。

我只想根據Fred Foo 的回答添加一些解釋。 假設我們有一個名為 'abc' 的字符串,我們想返回它的反向字符串,它應該是 'cba'。

def reverse(s):
    if s == "":
        return s
    else:
        return reverse(s[1:]) + s[0]
   
             
s = "abc"
print (reverse(s)) 

這段代碼的工作原理是:當我們調用函數時

reverse('abc')                       #s = abc
=reverse('bc') + 'a'                 #s[1:] = bc    s[0] = a
=reverse('c') + 'b' + 'a'            #s[1:] = c     s[0] = a
=reverse('') + 'c' + 'b' + 'a'
='cba'

如果這不僅僅是一個家庭作業問題,並且您實際上是為了某個更大的目標而嘗試反轉字符串,那么只需執行s[::-1]

def reverse_string(s):
    if s: return s[-1] + reverse_string(s[0:-1])
    else: return s

或者

def reverse_string(s):
    return s[-1] + reverse_string(s[0:-1]) if s else s

我知道現在回答原始問題為時已晚,這里已經有多種更好的方法可以回答。 我的回答是用於文檔目的,以防有人試圖實現字符串反轉的尾遞歸。

def tail_rev(in_string,rev_string):
    if in_string=='':
        return rev_string
    else:
        rev_string+=in_string[-1]
        return tail_rev(in_string[:-1],rev_string)
    
in_string=input("Enter String: ")
rev_string=tail_rev(in_string,'')
print(f"Reverse of {in_string} is {rev_string}") 
s = input("Enter your string: ")

def rev(s):
    if len(s) == 1:
        print(s[0])
        exit()
    else:
        #print the last char in string
        #end="" prints all chars in string on same line
        print(s[-1], end="")
        """Next line replaces whole string with same
         string, but with 1 char less"""
        return rev(s.replace(s, s[:-1]))

rev(s)

如果您不想返回響應,則可以使用此解決方案。 這個問題是 LeetCode 的一部分。

class Solution:
    i = 0
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        if self.i >= (len(s)//2):
            return
        s[self.i], s[len(s)-self.i-1] = s[len(s)-self.i-1], s[self.i]
        self.i += 1
        self.reverseString(s)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM