python 3.2 - find second smallest number in a list using recursion

后端 未结 7 1632
谎友^
谎友^ 2020-12-22 08:32

So I need to find the second smallest number within a list of integers using recursion but I cannot for the life of me devise a way to do it. I can do it with to find smalle

相关标签:
7条回答
  • 2020-12-22 08:56

    Here is a short implementation that doesn't use min() or sorted(). It also works when there are duplicate values in the list.

    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]))
    
    0 讨论(0)
  • 2020-12-22 08:59

    Here is a pure recursive way. You need to return the first smallest and the second smallest element in a tuple and so on.

    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 
    
    0 讨论(0)
  • 2020-12-22 09:00

    def second_smallest(my_list):

    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]
    
    0 讨论(0)
  • 2020-12-22 09:01

    Simpler example than my comment:

    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
    

    Example:

    Python 2.7.8 (default, Oct 20 2014, 15:05:19) 
    [GCC 4.9.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> from kthTerm import find_nth_smallest
    >>> import random
    >>> random.seed()
    >>> int_list = [random.randint(1, 100) for _ in range(20)]
    >>> int_list
    [68, 50, 6, 36, 98, 15, 81, 36, 13, 71, 76, 77, 69, 75, 79, 53, 26, 25, 18, 62]
    >>> find_nth_smallest(2, int_list)
    13
    >>> sorted(int_list)
    [6, 13, 15, 18, 25, 26, 36, 36, 50, 53, 62, 68, 69, 71, 75, 76, 77, 79, 81, 98]
    
    0 讨论(0)
  • 2020-12-22 09:06

    Here's an approach that doesn't blow the stack for large lists. It would be better to manage the search endpoints manually rather than using slicing which introduce copying.

    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)
    
    0 讨论(0)
  • 2020-12-22 09:09

    Here:

    def r_sort(a_list, ind):
        def rf(list_to_be_sorted, list_already_sorted):
            li = []
            if len(list_to_be_sorted) == 0:
                return list_already_sorted
            else:    
                x = min(list_to_be_sorted)    
                list_to_be_sorted.remove(x)
                li.append(x)
                return rf(list_to_be_sorted, list_already_sorted + li)
        return rf(a_list, [])[ind]
    
    >>> r_sort([1,10,9,5,55,3,2], 1)  
    2
    
    0 讨论(0)
提交回复
热议问题