【问题标题】:Sorting a list using unicodes acending order, no loops, no sort(), using recursion使用 unicodes 升序对列表进行排序,没有循环,没有 sort(),使用递归
【发布时间】:2021-09-06 17:34:07
【问题描述】:

我写下了这段代码,它可以工作,但是当我将它转换为 .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))

【问题讨论】:

  • 你没有返回排序递归调用
  • 您对sortl 的递归调用每次都使用完整列表,因此每次调用的长度都不会减少,这意味着您有无限递归。

标签: python sorting recursion unicode


【解决方案1】:

您不需要使用chrord。您可以使用 insert 帮助器编写简单的递归 sort。我们将使用inductive reasoning 来编写每个函数。

  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']

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

【讨论】:

    猜你喜欢
    • 2022-01-17
    • 2020-05-30
    • 1970-01-01
    • 1970-01-01
    • 2023-04-11
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多