Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 简单递归函数中的矛盾输出_Python_Function_Recursion - Fatal编程技术网

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))