Python 简单递归函数中的矛盾输出
注意:该函数的目标是删除重复的字符 现在,对于同一给定递归函数,不同的参数会弹出不同的输出:Python 简单递归函数中的矛盾输出,python,function,recursion,Python,Function,Recursion,注意:该函数的目标是删除重复的字符 现在,对于同一给定递归函数,不同的参数会弹出不同的输出: def rd(x): if x[0]==x[-1]: return x elif x[0]==x[1]: return rd(x[1: ]) else: return x[0]+rd(x[1: ]) print("Enter a sentence") r=raw_input() print("simplified: "+rd(r))
def rd(x):
if x[0]==x[-1]:
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
print("Enter a sentence")
r=raw_input()
print("simplified: "+rd(r))
仅当重复字符位于字符串的开头六个字符内时,此函数才适用于参数,例如:
如果r=abcdeeefghijk
或如果r=abcdefffffghijk
但如果重复字符位于前六个字符之后,则输出与输入相同,即输出=输入。这意味着在下面给定的“r”值下,函数不起作用:
如果r=abcdefggggggghijkde
(重复字符在前六个字符之后)函数不能正常工作的原因是您首先如果x[0]==x[-1]
,您会在那里检查当前子字符串的第一个和最后一个字符,但这会留下许多可能性,例如afffffa
或asdkkkk
,让我们看看原因:
示例1:'afffffa'
这是显而易见的,对吗
示例2:'asdkkk'
我们来看看你函数的第三种情况,然后再来一遍
'a' +rd('sdkkkkkk')
'a'+'s' +rd('dkkkkkk')
'a'+'s'+'d' +rd('kkkkkk')
当我们在“KKKK”中时,它停止了,因为第一个和最后一个是相同的
示例3:'asdfhhhf'
这里与示例2相同,在递归链中,我们到达fhhhf
,这里第一个和最后一个是相同的,因此它保持不变
如何修复它?很简单,正如其他人已经展示的那样,首先检查字符串的长度
def rd(x):
if len(x)<2: #if my string is 1 or less character long leave it untouched
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
试验
如果你不想进口任何东西,这里有另一种方法
def clean(text):
result=""
last=""
for c in text:
if c!=last:
last = c
result += c
return result
我在代码中发现的唯一问题是第一个
if
语句。我以为你用它来确保字符串至少有2长。它可以使用字符串修饰符len()
来完成,实际上整个函数都可以,但是为了便于操作,我们将让它保持递归
def rd(x):
if len(x) < 2: #Modified to return if len < 2. accomplishes same as original code and more
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
r=raw_input("Enter a sentence: ")
print("simplified: "+rd(r))
您的函数是正确的,但如果要检查最后一个字母,函数必须是: def rd(x): if len(x)==1: return x elif x[0]==x[1]: return rd(x[1: ]) else: return x[0]+rd(x[1: ]) print("Enter a sentence") r=raw_input() print("simplified: "+rd(r)) def rd(x): 如果len(x)==1: 返回x elif x[0]==x[1]: 返回rd(x[1:]) 其他: 返回x[0]+rd(x[1:] 打印(“输入句子”) r=原始输入() 打印(“简化:+rd(r))
功能的目标是什么?删除重复字符?是的,完全@agoldit对我来说很好,除非重复字符是最后一个,然后它适用于您在这里放置的所有三个示例(也适用于'abcdefggggghijk'),但如果您的开始字符和结束字符相同,则它将不起作用,例如:'abbbca'。r=abcdefggggggg的输出是什么?谢谢您的建议,伙计,但我不担心其他解决方法!!我很关心为什么那个特殊的功能对我不起作用,因为bcz机器不会错!!我关心它的逻辑原因。为什么?是的,很抱歉,解释补充道。他们很抱歉我没看到你的解释,因为我的浏览器完全搞砸了!!你让我完全明白了…谢谢你,伙计!!hatsoff to you:)我的第一个if语句错了,你的解释让我逻辑清晰:)很高兴你喜欢它,我还添加了另一种方法来做它,没有任何重要性。是的,我现在也检查了!!我必须欣赏你的逻辑思维:)竖起大拇指!:)最后一封信??哪一个?k,例如:r=abcdefghijkkmy第一个“if语句”是2如果字符串长度为一个字符,请确保函数返回确切的参数!!你的这句话把我弄糊涂了“我假设你用它来确保字符串至少有2个长度”…我不关心另一种方式,我关心的是为什么该函数不工作,我错在哪里,或者我关心的是什么问题好吧,那么我的解决方案正确地做到了这一点并修复了一个潜在的错误。(若用户什么也不输入会发生什么?对于原始代码,它会抛出一个索引错误,但现在它只是返回)。如果len为1,则返回;如果len为0,则返回。使用len()而不是原始值意味着输入'abba'不会仅仅返回,因为输入[0]==input[-1]。希望这有意义。哦!!:o非常感谢buddy提供的重要信息。非常感谢。如果你能把我看不清的主要问题告诉我,我会更加感激的!!你知道吗!!当我用“if x”替换if语句时
def rd(x):
if len(x) < 2: #Modified to return if len < 2. accomplishes same as original code and more
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
r=raw_input("Enter a sentence: ")
print("simplified: "+rd(r))
from collections import OrderedDict
def rd(string):
#assuming order does matter we will use OrderedDict, no longer recursive
return "".join(OrderedDict.fromkeys(string)) #creates an empty ordered dict eg. ({a:None}), duplicate keys are removed because it is a dict
#grabs a list of all the keys in dict, keeps order because list is orderable
#joins all items in list with '', becomes string
#returns string
r=raw_input("Enter a sentence: ")
print("simplified: "+rd(r))
def rd(x):
if len(x)==1:
return x
elif x[0]==x[1]:
return rd(x[1: ])
else:
return x[0]+rd(x[1: ])
print("Enter a sentence")
r=raw_input()
print("simplified: "+rd(r))