我是 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"))
答案 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"