python 3.2-使用递归查找列表中第二小的数字

python 3.2-使用递归查找列表中第二小的数字,python,recursion,python-3.2,Python,Recursion,Python 3.2,所以我需要用递归法在整数列表中找到第二个最小的数,但我无法想出一种方法。我可以通过以下方法找到最小的数字: def smallest(int_list): if(len(int_list) == 1): return int_list[0] else: a = smallest(int_list[1:]) b = int_list[0] if(a <= b): return a

所以我需要用递归法在整数列表中找到第二个最小的数,但我无法想出一种方法。我可以通过以下方法找到最小的数字:

def smallest(int_list):

    if(len(int_list) == 1):
        return int_list[0]
    else:
        a = smallest(int_list[1:])
        b = int_list[0]

        if(a <= b):
            return a
        else:
            return b
def最小值(整数列表):
如果(len(int_list)==1):
返回整数列表[0]
其他:
a=最小值(整数列表[1:])
b=整数列表[0]

如果(a这应该行得通。get_minimable_two_items()返回一个元组,其中输入的3个元素中有最小的2个。实现它应该很简单。还要注意,这假设列表的最小长度为2

def smallest(int_list):
   smallest_two = smallest_helper(int_list)
   return smallest_two[0] if smallest_two[0]<=smallest_two[1] else smallest_two[1]

def smallest_helper(int_list):

  if(len(int_list) == 2):
    return (int_list[0],int_list[1])
  else:
    a_b = smallest(int_list[1:])
    a = a_b[0]
    b = a_b[1]
    c = int_list[0]

    return get_smallest_two_items(a,b,c)
def最小值(整数列表):
最小的两个=最小的辅助对象(整数列表)

如果最小值[0]比我的注释更简单,则返回最小值[0]:

def find_nth_smallest(n, int_list):
    smallest = min(int_list)
    if n <= 1:
        return smallest
    int_list = [v for v in int_list if v != smallest]
    if int_list:
        return max(find_nth_smallest(n - 1, int_list), smallest)
    return None
在这里:


这是一种不会对大型列表造成破坏的方法。最好是手动管理搜索端点,而不是使用引入复制的切片

import random

def min2(xs):
    if len(xs) < 3: return xs
    n = len(xs) // 2
    return sorted(min2(xs[:n]) + [xs[n]] + min2(xs[n+1:]))[:2]

tk = range(100000)
random.shuffle(tk)
print min2(tk)
随机导入
def min2(xs):
如果len(xs)<3:返回xs
n=len(xs)//2
返回排序(min2(xs[:n])+[xs[n]]+min2(xs[n+1:])[:2]
tk=范围(100000)
随机洗牌(tk)
打印min2(tk)

这是一种纯粹的递归方法。您需要返回元组中的第一个最小元素和第二个最小元素,依此类推

def smallest(int_list):

    if(len(int_list) == 2):
        if (int_list[0] >= int_list[1]):
            return (int_list[0],int_list[1])
        else:
            return (int_list[1],int_list[0])
    else:
        first_smallest,second_smallest = smallest(int_list[1:])
        current_elem = int_list[0]
        if(second_smallest <= current_elem):
            return (second_smallest,current_elem)
        else:
            if (current_elem<=first_smallest):
               return (current_elem,first_smallest)
            else:
               return (first_smallest,second_smallest)



if __name__ == "__main__":    
    small = smallest([1,2,3,4])
    print small[1]
    //output 2 
def最小值(整数列表):
如果(len(int_list)==2):
如果(整数列表[0]>=整数列表[1]):
返回(整数列表[0],整数列表[1])
其他:
返回(整数列表[1],整数列表[0])
其他:
第一个最小,第二个最小=最小(整数列表[1:])
当前元素=整数列表[0]
如果(次最小def次最小(我的列表):

如果len(我的列表)==2:
如果my_list[0]>my_list[1]或my_list[1],则返回my_list[0]
其他:
sec_least=second_minister(我的列表[1:])
如果sec_least<我的_列表[0]或my_列表[1],则返回sec_least

这里有一个简短的实现,它不使用
min()
sorted()
。当列表中存在重复值时,它也可以工作

def ss(e):
    if len(e)==2 and e[0]<=e[1]:return e[1]
    return ss(e[:-1]) if e[0]<=e[-1]>=e[1] else ss([e[-1]]+e[:-1])

print("The selected value was:", ss([5, 4, 3, 2, 1]))
def ss(e):

如果len(e)==2且e[0]创建两个函数,一个查找最小的函数,另一个尝试查找下一个最小的函数(给定第一个函数的返回值),而不是只返回最小的函数,尝试返回一个元组,该元组包含到目前为止已处理的列表部分中最小的和第二小的。在每个步骤中不断更新元组。介绍了非常好。检查我的答案,我实现了@shridharama建议的东西。有一件事不是很清楚,你想返回第二小的元素吗?即使元素是重复的,比如返回
[1,1,2,3]
?或者你想要
2
?嗯。介意在向下投票之前评论吗?当然,那
从哪里得到最小的两项(a,b,c)
来自哪里?@Anzel具体如何?它以元组的形式返回a,b和c中最小的一个,正如我在回答中提到的。你甚至测试过你的代码吗?你没有一个名为
get_minimate_two_items()的函数
…这是一个名称错误,我在回答中提到,该方法应该易于实现。我的目标不是编写完美的可执行代码,而是将OP指向正确的方向。Stackoverflow并不意味着填鸭式地输入每一行代码。第二个最小的([2,1,3,4,5])返回1,但应返回2。次_最小([1,1,2,3,4])返回2,但应返回1。最小([2,1,3,4,5])应返回2。此返回(1,3)。
def smallest(int_list):

    if(len(int_list) == 2):
        if (int_list[0] >= int_list[1]):
            return (int_list[0],int_list[1])
        else:
            return (int_list[1],int_list[0])
    else:
        first_smallest,second_smallest = smallest(int_list[1:])
        current_elem = int_list[0]
        if(second_smallest <= current_elem):
            return (second_smallest,current_elem)
        else:
            if (current_elem<=first_smallest):
               return (current_elem,first_smallest)
            else:
               return (first_smallest,second_smallest)



if __name__ == "__main__":    
    small = smallest([1,2,3,4])
    print small[1]
    //output 2 
if len(my_list) == 2:
    return my_list[0] if my_list[0] > my_list[1] else my_list[1]

else:
    sec_least = second_smallest(my_list[1:])
    return sec_least if sec_least < my_list[0] else my_list[1]
def ss(e):
    if len(e)==2 and e[0]<=e[1]:return e[1]
    return ss(e[:-1]) if e[0]<=e[-1]>=e[1] else ss([e[-1]]+e[:-1])

print("The selected value was:", ss([5, 4, 3, 2, 1]))