首页 > 解决方案 > 使用 unicode 升序对列表进行排序,没有循环,没有 sort(),使用递归

问题描述

我写下了这段代码,它可以工作,但是当我将它转换为.py并尝试使用输入运行它时,我会写下递归已达到限制或类似的东西。

注意:在我的作业中,我没有使用sort()min()和其他功能。

def sortl(lst, i, b_ord):
    if len(lst) == i:
        return lst
    
    elif b_ord > ord(lst[i]):
        lst[i - 1] = lst[i]
        lst[i] = chr(b_ord)
        b_ord = ord(lst[0])
        i = 0
            
    else:
        b_ord = ord(lst[i])
    
    sortl(lst, (i + 1), b_ord)

lst = list(input())
n = ord('0')
i = 0

sortl(lst,i,n)
print("".join(lst))

标签: pythonsortingrecursionunicode

解决方案


您不需要使用chrordsort您可以使用帮助程序编写简单的递归insert。我们将使用归纳推理来编写每个函数。

  1. 如果列表是一个或更少的元素,则返回列表
  2. (归纳)至少有两个元素。insert头, l[0], 到sorted 尾,l[1:]
def sort(l):
  if len(l) < 2:
    return l                          # 1
  else:
    return insert(sort(l[1:]), l[0])  # 2

insert将值插入排序列表 -

  1. 如果列表为空,则返回一个单例列表value
  2. (归纳)列表作为至少一个元素。如果列表头小于要插入的值,则将列表头添加到递归子问题
  3. (归纳)列表至少有一个元素并且大于值,将值添加到列表中
def insert(sorted, value):
  if not sorted:
    return [value]                                  # 1
  elif sorted[0] < value:
    return [sorted[0]] + insert(sorted[1:], value)  # 2
  else:
    return [value] + sorted                         # 3
print(sort([5,3,6,1,4,7,2]))
print(sort("gebafcd"))
[1, 2, 3, 4, 5, 6, 7]
['a', 'b', 'c', 'd', 'e', 'f', 'g']

这绝对不是性能最好的排序技术,但它足够简单,可以开始理解递归


推荐阅读