Método recursivo para encontrar el número mínimo en una lista de números

Dada esta lista de muestra:

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

¿Cómo encontrar el número mínimo usando la recursión? La respuesta es 2 .

Encontré esto en un documento de preguntas mientras hacía ejercicios de recursión. No puedo encontrar una manera de resolver esto. Para encontrarlo, primero tengo que ordenar la lista y luego no hay nada que hacer recursivamente. ¿Alguien puede mostrarme un camino?

Esta es una implementación recursiva de 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>> 2 

Tenga en cuenta que esto no debe utilizarse en progtwigs reales y debe tratarse como un ejercicio. El rendimiento será peor que el min incorporado en varios órdenes de magnitud.

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

Nota: la recursión no es realmente necesaria aquí.

Esta respuesta utiliza un acumulador para almacenar el valor mínimo a lo largo de las recursiones.

 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)) 

Eso también funciona, pero solo para listas con una longitud que es una potencia de dos. Para otras longitudes solo tienes que ajustar la división en matrices más pequeñas. El enfoque se toma de la fusión de ordenación .

 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 

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

Esto parece funcionar bien