递归函数,它接受一个列表和一个整数,并按顺序返回列表中的整数

时间:2013-11-06 01:04:32

标签: python recursion

所以让我说我的这个功能:

squeeze([1,4,7,9], 8)
squeeze([1,4,7,9], 0)

我希望函数返回一个包含以下内容的新列表:

[1,4,7,8,9]
[0,1,4,7,9]

我想使用递归来创建此函数,但我遇到了麻烦

def squeeze(x:list, num:int):
    if len(x) == 1:
        if num < x[0]:
            return [num] + x #if the integer is less than the 1st value, put it in the front
        elif x[0] < num < x[2]: 
            return [x[0]] + [num] + [x[2]] #put it in the list
         #insert this number into the correct spot
    else: 
        return squeeze(num, x[0:1]) + squeeze(num, x[1:]) #i don't think this is right

我无法比较列表中的数字并使用递归将其放在正确的位置。

2 个答案:

答案 0 :(得分:3)

你可以这样做

def squeeze(myList, num):
    if myList == []:
        return [num]
    elif num > myList[0]:
        return [myList[0]] + squeeze(myList[1:], num)
    else:
        return [num] + myList

print squeeze([1,4,7,9], 10)
print squeeze([1,4,7,9], 8)
print squeeze([1,4,7,9], 0)

<强>输出

[1, 4, 7, 9, 10]
[1, 4, 7, 8, 9]
[0, 1, 4, 7, 9]

<强>解释

  1. 如果myList为空,请返回num列表
  2. 如果num大于myList的第一个元素,则num不适合此处。所以,我们进一步递归,留下myList的第一个元素。 (myList[1:]表示没有第0个元素)。例如,myList[4, 7, 9]num为8.因此,我们将4留下并递归[7, 9]和8,仍然8大于7,所以现在我们这次递归[9],8小于9,所以我们通过else部分返回[8, 9]。当递归解除时,我们得到[7, 8, 9],然后得到[4, 7, 8, 9]
  3. 如果num小于或等于myList的第一个元素,则我们需要放置num。因此,我们只需将num放在myList的开头并将其返回。

答案 1 :(得分:0)

好的,已经有一个答案被赞成并接受但是这不仅仅是一个倾向/家庭作业的事情,而且有人真的想要这样做,这是一个模块

查看bisect中可用的内容。

from bisect import insort

a = [1,4,7,9]
insort(a, 10)
print a

a = [1,4,7,9]
insort(a, 8)
print a

a = [1,4,7,9]
insort(a, 0)
print a

输出是预期的结果,但也有insort_leftinsort_right来微调您的关系政策。

注意:这不会返回列表,它会修改旧版本,但很容易用原始版本的副本包装,首先会留下两行{{ 1}}功能。