在python中递归合并两个字符串而不使用内置函数

在python中递归合并两个字符串而不使用内置函数,python,python-3.x,string,sorting,recursion,Python,Python 3.x,String,Sorting,Recursion,在名为concat_strings.py的文件中编写一个Python程序,其中包括以下函数: orderedConcat,一个递归函数,它接受两个按字母顺序排列的字符串并合并它们,留下 按字母顺序排列的字母。请注意,字符串的长度可能不同 一种主方法,它输入两个有序字符串并调用orderedConcat方法以返回结果合并的有序字符串。main方法应该打印两个输入字符串和结果 注意:对于字符串连接或排序,您不能使用任何内置方法,但可以使用len()函数和切片运算符(:)。您可以假设输入字符串已经排序

在名为
concat_strings.py
的文件中编写一个Python程序,其中包括以下函数:

orderedConcat
,一个递归函数,它接受两个按字母顺序排列的字符串并合并它们,留下 按字母顺序排列的字母。请注意,字符串的长度可能不同

一种主方法,它输入两个有序字符串并调用
orderedConcat
方法以返回结果合并的有序字符串。main方法应该打印两个输入字符串和结果

注意:对于字符串连接或排序,您不能使用任何内置方法,但可以使用
len()
函数和切片运算符(:)。您可以假设输入字符串已经排序

输入/输出示例:

Enter the first ordered string: DEab
Enter the second ordered string: BFxz
First string: DEab
Second string: BFxz
Result: BDEFabxz
注意:我对编程一无所知,很难弄明白这一点。从理论上讲 字符串必须加在一起,但如何按字母顺序排序?我如何处理大小写字母?我使用选择排序还是合并排序?我的基本情况和递归情况应该是什么?任何帮助都将不胜感激

到目前为止,我已经尝试了什么(虽然不多,但我尽了我所能):

def orderedConcat(长度):
新闻字符串=string1+string2
长度=长度(新闻字符串)
如果长度==1或长度==“”:
返回真值

elif length[0]让我们一步一步地完成这个过程。首先,我们的函数接受两个字符串,我们将它们称为
a
b

def orderedConcat(a, b):
在编写递归函数时,我们通常从基本情况开始。在这种情况下,有两种基本情况:

  • a
    为空,因此不需要合并,我们只需返回
    b
    (因为
    b
    已排序)
  • b
    为空,遵循与案例1相同的逻辑并返回
    a
  • 代码:

    if len(a) == 0:
        return b
    elif len(b) == 0:
        return a
    else:
        # ...
    

    现在,对于递归情况,我们需要比较两个字符串
    a[0]
    b[0]
    的第一个元素。如果
    a[0]
    (Python实现
    ),我不知道如何递归处理大小写,但这可能是一个快速解决方法

    def orderedConcat(string1, string2):
        if len(string1 + string2) == 0:
            return ''
        elif (len(string1) > 0 and len(string2) == 0) or (len(string1) == 0 and len(string2) > 0):
            return string1 + string2
        else:
            if string1[0] < string2[0]:
                return string1[0] + orderedConcat(string1[1:], string2)
            elif string2[0] < string1[0]:
                return string2[0] + orderedConcat(string1, string2[1:])
            else: # if they're equal
                return string1[0] + string2[0] + \
                    orderedConcat(string1[1:], string2[1:])
    
    
    def main():
        string1 = "acdrt"
        string2 = "bdet"
        print("First string: ", string1)
        print("Second string: ", string2)
        print("Result : ", end=' ')
        print(orderedConcat("acdrt", "bdet"))
    
    
    main()
    
    def orderedConcat(string1、string2):
    如果len(string1+string2)==0:
    返回“”
    elif(len(string1)>0和len(string2)==0)或(len(string1)==0和len(string2)>0):
    返回字符串1+字符串2
    其他:
    如果string1[0]
    查看您的功能:

    def orderedConcat(length):
        newString = string1 + string2
        length = len(newString) #cut
    
        elif st1[:1] <= st2[:1]:
            newString = newString + st1[:1]
            return oC(st1[1:], st2[:])  #shorten here
        else: 
            newString = newString + st2[:1]
            return oC(st1[:], st2[1:])
    
    首先,您必须将字符串传递到函数中,而不是传递长度。因此,从定义开始。为了在概念上更简单,让我们使用Python作用域规则声明一个静态变量,一个空字符串来保存最终的具体排序结果(全局允许字符串
    newString
    在多个函数调用中保持和增长,而不是在每次调用时重新初始化):

    第二,任何递归问题的第一步是确定将停止递归的基本情况,这样就不会无限递归。因为我们处理的是字符串,并且将它们切碎,所以基本情况将是len相关的。而且字符串是单独排序的,所以剩下的任何东西(如果一个比另一个长)这不是问题,我们只需将剩余部分涂到混凝土上即可:

        if len(st1) == 0:
            newString += st2
            return
        elif len(st2) == 0:
            newString += st1
            return
    
    在整理好基本情况后,任何递归问题的下一步是按顺序缩短问题-将其分成越来越小的部分,以便最终达到基本情况。在这里,我们可以使用slice运算符按顺序比较字符串元素,并缩短字符串以反馈到函数中:

    def orderedConcat(length):
        newString = string1 + string2
        length = len(newString) #cut
    
        elif st1[:1] <= st2[:1]:
            newString = newString + st1[:1]
            return oC(st1[1:], st2[:])  #shorten here
        else: 
            newString = newString + st2[:1]
            return oC(st1[:], st2[1:])
    
    这有点不方便。看看您是否能找出如何在这段代码中消除函数中对外部concat字符串和全局字符串的需要。

    您的示例不是按字母顺序排序,而是按字母顺序排序。这很好,因为它简化了我们的问题。而不是使用
    len()
    函数是一个例外,我们也不要使用它:

    def orderedConcat(a, b):
        if a:
            if b:
                if a[:1] < b[:1]:
                    return a[:1] + orderedConcat(a[1:], b)
    
                return b[:1] + orderedConcat(a, b[1:])
            return a
        return b
    
    print(orderedConcat('DEab', 'BFxz'))
    
    def orderedConcat(a,b):
    如果是:
    如果b:
    如果a[:1]
    我认为你需要做更多的工作来更好地理解这个问题,因为你提出的解决方案与你在问题中提出的问题相去甚远,在这里得到解决方案的更好方法是了解你必须做什么,并尝试解决问题你自己的第一个问题你这么说吗“获取两个按字母顺序排列的字符串并合并它们的函数”,但在示例中输入了两个不按字母顺序排列的字符串,是否正确?第二个问题:orderedConcat接收两个参数,但在您的示例中只有一个参数。为什么??
        elif st1[:1] <= st2[:1]:
            newString = newString + st1[:1]
            return oC(st1[1:], st2[:])  #shorten here
        else: 
            newString = newString + st2[:1]
            return oC(st1[:], st2[1:])
    
    newString = ""
    oC(st1, st2)
    
    def orderedConcat(a, b):
        if a:
            if b:
                if a[:1] < b[:1]:
                    return a[:1] + orderedConcat(a[1:], b)
    
                return b[:1] + orderedConcat(a, b[1:])
            return a
        return b
    
    print(orderedConcat('DEab', 'BFxz'))