颠倒顺序

时间:2021-03-12 23:14:45

标签: python python-3.x string recursion

我是 Python 新手,对递归不太擅长,所以如果有人能帮助我解决这个问题,我将不胜感激。 所以我基本上是在尝试颠倒字符串的顺序。例如,如果字符串是“It's me”,它应该返回“me It's”。虽然,我得到了一个完全颠倒的字符串,而且在大多数情况下我得到一个错误,说第二个函数没有定义。

def reverse_phrase(str):
    reverse_phrase_recursive(str.split())

def reverse_phrase_recursive(str):
    if len(str)==0:
        return str
    else:
        return reverse_phrase(str[1:]) + str[0]
        
print(reverse_phrase("DO I CHOOSE YOU PIKACHU"))

6 个答案:

答案 0 :(得分:1)

你需要调用 reverse_phrase_recursive 作为递归调用,否则一个列表将被传递给 reverse_phrase,然后它会尝试在一个列表上调用 .split(),这会抛出一个 AttributeError。< /p>

此外,实际上从 reverse_phrase 返回值并将该值连接到递归调用一个列表,因为您不能将 str 直接连接到一个列表。

def reverse_phrase(str):
    return " ".join(reverse_phrase_recursive(str.split()))

def reverse_phrase_recursive(str):
    if len(str)==0:
        return str
    else:
        return reverse_phrase_recursive(str[1:]) + [str[0]]
        
print(reverse_phrase("DO I CHOOSE YOU PIKACHU"))

旁注:不要将变量命名为“str”,它会覆盖内置的 str

答案 1 :(得分:0)

def reverse_phrase(str):
    return ' '.join(reversed(str.split()))

答案 2 :(得分:0)

这是一个倒车的解决方案:

def reverse(s): 
    return ' '.join(s.split()[::-1])

s = "DO I CHOOSE YOU PIKACHU" 
reverse(s)

#Output: 

'PIKACHU YOU CHOOSE I DO'

答案 3 :(得分:0)

这里是一个不需要执行整个拆分/连接过程的递归。正如我在评论中提到的那样,它在性能方面代价高昂。


def reverse_phrase(str, reversedStr=""):
    if (len(reversedStr) == len(str)):
      return reversedStr;

    reversedStrLength = len(reversedStr);  
    index = len(str) - reversedStrLength - 1;
    reversedStr += str[index];

    return reverse_phrase(str, reversedStr);
   
        
print(reverse_phrase("DO I CHOOSE YOU PIKACHU"));

答案 4 :(得分:0)

这是另一种不使用 join 的方法。您的 reverse_phrase() 函数调用带有单词列表的递归函数。递归函数的基本情况是当列表的长度为 2 时,在这种情况下它交换两个单词。否则,它将列表的最后一个单词与所有首字母单词的递归输出交换。

local

答案 5 :(得分:0)

这是另一种不依赖于内置函数 .split -

def reverse_phrase(s):
  def loop(s, word, phrase):
    if not s:
      return word + " " + phrase                #1
    elif s[0] == " ":
      return loop(s[1:], "", word + " " + phrase) #2
    else:
      return loop(s[1:], word + s[0], phrase)       #3
  return loop(s, "", "")

print(reverse_phrase("DO I CHOOSE YOU PIKACHU"))

评估为 -

loop("DO I CHOOSE YOU PIKACHU", "", "")             #3
loop("O I CHOOSE YOU PIKACHU", "D", "")             #3
loop(" I CHOOSE YOU PIKACHU", "DO", "")           #2
loop("I CHOOSE YOU PIKACHU", "", "DO ")             #3
loop(" CHOOSE YOU PIKACHU", "I", "DO ")           #2
loop("CHOOSE YOU PIKACHU", "", "I DO ")             #3
loop("HOOSE YOU PIKACHU", "C", "I DO ")             #3
loop("OOSE YOU PIKACHU", "CH", "I DO ")             #3
loop("OSE YOU PIKACHU", "CHO", "I DO ")             #3
loop("SE YOU PIKACHU", "CHOO", "I DO ")             #3
loop("E YOU PIKACHU", "CHOOS", "I DO ")             #3
loop(" YOU PIKACHU", "CHOOSE", "I DO ")           #2
loop("YOU PIKACHU", "", "CHOOSE I DO ")             #3 
loop("OU PIKACHU", "Y", "CHOOSE I DO ")             #3
loop("U PIKACHU", "YO", "CHOOSE I DO ")             #3
loop(" PIKACHU", "YOU", "CHOOSE I DO ")           #2
loop("PIKACHU", "", "YOU CHOOSE I DO ")             #3
loop("IKACHU", "P", "YOU CHOOSE I DO ")             #3
loop("KACHU", "PI", "YOU CHOOSE I DO ")             #3
loop("ACHU", "PIK", "YOU CHOOSE I DO ")             #3
loop("CHU", "PIKA", "YOU CHOOSE I DO ")             #3
loop("HU", "PIKAC", "YOU CHOOSE I DO ")             #3
loop("U", "PIKACH", "YOU CHOOSE I DO ")             #3
loop("", "PIKACHU", "YOU CHOOSE I DO ")         #1
"PIKACHU YOU CHOOSE I DO "

我认为重要的是不要只以一种方式思考问题。尝试以不同的方式去做 -

def rev(s, pos = 0):
  if pos >= len(s):
    return s                              #1
  elif s[pos] == " ":
    return rev(s[pos+1:]) + " " + s[0:pos]  #2
  else:
    return rev(s, pos + 1)                    #3

print(rev("DO I CHOOSE YOU PIKACHU"))

评估为 -

rev("DO I CHOOSE YOU PIKACHU", 0)                    #3
rev("DO I CHOOSE YOU PIKACHU", 1)                    #3
rev("DO I CHOOSE YOU PIKACHU", 2)                  #2
rev("I CHOOSE YOU PIKACHU", 0) + " " + "DO"          #3
rev("I CHOOSE YOU PIKACHU", 1) + " DO"             #2
rev("CHOOSE YOU PIKACHU", 0) + " " + "I" + " DO"     #3
rev("CHOOSE YOU PIKACHU", 1) + " I DO"               #3
rev("CHOOSE YOU PIKACHU", 2) + " I DO"               #3
rev("CHOOSE YOU PIKACHU", 3) + " I DO"               #3
rev("CHOOSE YOU PIKACHU", 4) + " I DO"               #3
rev("CHOOSE YOU PIKACHU", 5) + " I DO"               #3
rev("CHOOSE YOU PIKACHU", 6) + " I DO"             #2                
rev("YOU PIKACHU", 0) + " " + "CHOOSE" + " I DO"     #3
rev("YOU PIKACHU", 1) + " CHOOSE I DO"               #3
rev("YOU PIKACHU", 2) + " CHOOSE I DO"               #3
rev("PIKACHU", 0) + " " + "YOU" + " CHOOSE I DO"   #2
rev("PIKACHU", 1) + " YOU CHOOSE I DO"               #3
rev("PIKACHU", 2) + " YOU CHOOSE I DO"               #3
rev("PIKACHU", 3) + " YOU CHOOSE I DO"               #3
rev("PIKACHU", 4) + " YOU CHOOSE I DO"               #3
rev("PIKACHU", 5) + " YOU CHOOSE I DO"               #3
rev("PIKACHU", 6) + " YOU CHOOSE I DO"               #3
rev("PIKACHU", 7) + " YOU CHOOSE I DO"           #1
"PIKACHU" + " YOU CHOOSE I DO"
"PIKACHU YOU CHOOSE I DO"

表达程序的方式有无数种 -

def find(s, char, ifmatch, nomatch):
  def loop(pos):
    if pos >= len(s):
      return nomatch()
    elif s[pos] == char:
      return ifmatch(pos)
    else:
      return loop(pos+1)
  return loop(0)

def cut(s, char, ifmatch, nomatch):
  return find \
    ( s
    , char
    , lambda pos: ifmatch(s[0:pos], s[pos+1:])
    , lambda: nomatch(s)
    )

def rev(s):
  return cut \
    ( s
    , " "
    , lambda left, right: rev(right) + " " + left
    , lambda last: last
    )

print(rev("DO I CHOOSE YOU PIKACHU"))

评估为 -

cut \
  ( "DO I CHOOSE YOU PIKACHU"s
  , " "
  , lambda left, right: rev(right) + " " + left
  , lambda last: last
  )

find \
  ( "DO I CHOOSE YOU PIKACHU"
  , " "
  , lambda pos: (lambda left, right: rev(right) + " " + left)("DO I CHOOSE YOU PIKACHU"[0:pos], "DO I CHOOSE YOU PIKACHU"[pos+1:])
  , lambda: (lambda last: last)("DO I CHOOSE YOU PIKACHU")
  )

loop(0)
loop(1)
loop(2)

(lambda left, right: rev(right) + " " + left) \
  ("DO I CHOOSE YOU PIKACHU"[0:2], "DO I CHOOSE YOU PIKACHU"[2+1:])

rev("I CHOOSE YOU PIKACHU") + " " + "DO"

# ...
"PIKACHU YOU CHOOSE I DO"