简单递归函数中的矛盾输出

时间:2016-05-07 19:22:44

标签: 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))

仅当重复字符位于字符串的前六个字符内时,此函数才适用于参数,例如:

如果r=abcdeeeeeeefghijkr=abcdeffffffghijk

但如果重复字符在前六个字符之后,则输出与输入相同,即output = input。这意味着使用下面给出的值“r”,该函数不起作用:

if r=abcdefggggggggghijkde(重复字符在前六个字符之后)

3 个答案:

答案 0 :(得分:1)

你的功能不正常的原因是你先if x[0]==x[-1],你在那里检查当下子串的第一个和最后一个字符,但是留下许多可能性,如affffffa或{ {1}}例如,让我们看看原因:

示例1:asdkkkkkk

这显然是对的吗?

示例2:'affffffa'

这里我们选择你的函数的情况3,然后再次

'asdkkkkkk'

当我们在'a' +rd('sdkkkkkk') 'a'+'s' +rd('dkkkkkk') 'a'+'s'+'d' +rd('kkkkkk') 时,它会停止,因为第一个和最后一个是相同的

示例3:'kkkkkk'

这里与示例2相同,在递归链中我们到达'asdfhhhhf',这里第一个和最后一个是相同的,所以它保持不变

如何修复它?,简单,就像其他已经显示的那样,首先检查字符串的长度

fhhhhf

这里是做同样的替代和迭代方法:你可以使用itertools recipes中的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: ]) 食谱

unique_justseen

测试

from itertools import groupby
from operator import itemgetter

def unique_justseen(iterable, key=None):
    "List unique elements, preserving order. Remember only the element just seen."
    # unique_justseen('AAAABBBCCDAABBB') --> A B C D A B
    # unique_justseen('ABBCcAD', str.lower) --> A B C A D
    return map(next, map(itemgetter(1), groupby(iterable, key)))

def clean(text):
    return "".join(unique_justseen(text)

如果你不想导入任何东西,这是另一种方式

>>> clean("abcdefggggggggghijk")
'abcdefghijk'
>>> clean("abcdefghijkkkkkkkk")
'abcdefghijk'
>>> clean("abcdeffffffghijk")
'abcdefghijk'
>>> 

答案 1 :(得分:1)

我在代码中找到的唯一问题是第一个if语句。我假设你用它来确保字符串至少有2个长。它可以使用字符串修饰符len()来完成,实际上整个函数可以但我们会为OP提供递归。

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

答案 2 :(得分:0)

您的功能正确但是,如果您想查看最后一个字母,则该功能必须为:

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