2009-07-26 9 views

Respuesta

7

Busque en las listas Max function, que devuelve el número más grande de la lista. Desde allí, puede verificar si este valor es inferior a un cierto número.

+0

Gracias, buena idea. – Nope

+0

Solo para deletrearlo: 'magicFunction [lst_, val_]: = Max [lst] dreeves

3

Este tipo de prueba es fácil de construir usando 'Fold':

magicFunction[ lst_, val_ ] := 
Fold[ ((#2 < val) && #1) &, True, lst ] 

La frase '(# 2 < val)' es la prueba de cada elemento de la lista ('# 2'). Podrías poner cualquier prueba que quisieras aquí, para que puedas hacer pruebas más potentes que con una función enumerable como Max.

El '& & # 1' combina el resultado de su elemento actual con el resultado para todos los elementos anteriores.

Y 'Verdadero' es el caso base: el resultado de una lista vacía.

Para ver cómo funciona, puede pasar en algunos valores no definidos y ver lo que la expresión se expande a:

In[10]:= magicFunction[ {a, b, c}, 10 ] 

Out[10]= c < 10 && b < 10 && a < 10 
6

Antes de ofrecer mi solución Permítanme comentar las dos soluciones anteriores. Llamemos a la solución de Joey Robert magicFunction1 y la solución de Eric magicFunction2.

magicFunction1 es muy corto y elegante. Lo que no me gusta es que si tengo una lista muy grande de números y la primera ya es más grande que 10, todavía hará todo el trabajo de calcular el número más grande que no es necesario. Esto también se aplica a magicFunction2

que desarrollaron los siguientes dos soluciones:

magicFunction3[lst_, val_] := 
Position[# < val & /@ lst, False, 1, 1] == {} 

y

magicFunction4[lst_, val_] := 
Cases[lst, x_ /; x >= val, 1, 1] == {} 

Hacer un punto de referencia que encontré

In[1]:= data = Table[RandomInteger[{1, 10}], {10000000}]; 

In[2]:= Timing[magicFunction1[data, 10]] 
Out[2]= {0.017551, False} 

In[2]:= Timing[magicFunction2[data, 10]] 
Out[2]= {10.0173, False} 

In[2]:= Timing[magicFunction3[data, 10]] 
Out[2]= {7.10192, False} 

In[2]:= Timing[magicFunction4[data, 10]] 
Out[2]= {0.402562, False} 

Así que mi mejor respuesta es magicFunction4, pero todavía no sé por qué es más lento que magicFunction1. También ignoro por qué hay una diferencia de rendimiento tan grande entre magicFunction3 y magicFunction4.

+1

el tiempo de Max y tu magicFunction4 podría ser debido a que Max es un built-in ... aunque no estoy seguro – Nope

+1

extra más para medir realmente – nes1983

Cuestiones relacionadas