用于在数字列表中查找最小数字的递归方法

时间:2015-06-03 14:42:26

标签: python recursion

鉴于此样本列表:

[5, 3, 9, 10, 8, 2, 7]

如何使用递归查找最小数字?答案是2

在我进行递归练习时,我在一份试卷中发现了这一点。我无法找到解决这个问题的方法。为了找到它,我是否必须先对列表进行排序,然后才能递归地执行任何操作。任何人都可以向我展示一条道路吗?

6 个答案:

答案 0 :(得分:4)

这是min的递归实现:

l=[5, 3, 9, 10, 8, 2, 7]
def find_min(l,current_minimum = None):
    if not l:
        return current_minimum
    candidate=l.pop()
    if current_minimum==None or candidate<current_minimum:
        return find_min(l,candidate)
    return find_min(l,current_minimum)
print find_min(l)
>>>
2     

考虑到这不应该在真实的程序中使用,应该被视为练习。性能将比内置min差几个数量级。

答案 1 :(得分:3)

>>> import random
>>> arr=[random.randint(0,8) for r in xrange(10)]
>>> arr
[8, 2, 5, 1, 2, 4, 0, 3, 1, 1]
>>> def func(arr):
    if len(arr) == 1:
        return arr[0]
    else:
        return min(arr[0],func(arr[1:]))


>>> f(arr)
0

NB 此处并不真正需要递归。

答案 2 :(得分:1)

这个答案使用累加器在整个递归过程中存储最小值。

list = [5, 3, 9, 10, 8, 2, 7]

def min_list(list, min=None):
    if len(list) < 1:
        return min
    return min_list(list[1:], list[0] if min is None or list[0] < min else min)

print(min_list(list))

答案 3 :(得分:1)

这也有效,但仅适用于长度为2的幂的列表。对于其他长度,您只需将分割调整为更小的数组。该方法取自merge sort

def findCloseToZero(l):
    if len(l) == 1:
        return l[0]
    else:
        first = findCloseToZero(l[0:int(len(l)/2)])
        sec = findCloseToZero(l[int(len(l)/2):])

        return first if abs(first) < abs(sec) else sec

答案 4 :(得分:1)

def find_smallest_elem(lst):

k=1

while k != len(lst):

    if lst[0] > lst[k]:

        return(find_smallest_elem(lst[k:]))
    else:

        k +=1

return(lst[0])

这似乎很好

答案 5 :(得分:0)

这是我使用递归和一行代码的答案

def min_value(n_list):
    return n_list[0] if len(n_list) == 1 else min(n_list[0], min_value(n_list[1:]))