Mathematica: Определите, являются ли все целые числа в списке меньше, чем число?

Это собирается походить на причудливое предложение, но я изучил, как использовать yield ключевое слово в C# путем чтения представления генераторов в Python: David M. Beazley http://www.dabeaz.com/generators/Generators.pdf . Вы не должны знать, что много Python понимает представление - я не сделал. Я нашел его очень полезным в объяснении не, как работают генераторы, но и почему необходимо заботиться.

5
задан Nope 26 July 2009 в 16:48
поделиться

3 ответа

Найдите в функции Max список, которая возвращает наибольшее число в списке. Оттуда вы можете проверить, меньше ли это значение определенного числа.

7
ответ дан 18 December 2019 в 10:47
поделиться

Прежде чем предлагать свое решение, позвольте мне прокомментировать два предыдущих решения. Давайте назовем решение Джоуи Роберта magicFunction1 и решение Эрика magicFunction2.

magicFunction1 очень коротко и элегантно. Что мне не нравится в этом, так это то, что если у меня очень большой список чисел, а первый уже больше 10, он все равно выполнит всю работу по вычислению наибольшего числа, которое не нужно. Это также относится к magicFunction2

. Я разработал следующие два решения:

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

и

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

Проведение теста, которое я нашел

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}

Так что мой лучший ответ - magicFunction4, но я все еще не знаю, почему он медленнее, чем magicFunction1 . Я также игнорирую, почему существует такая большая разница в производительности между magicFunction3 и magicFunction4.

6
ответ дан 18 December 2019 в 10:47
поделиться

Этот вид теста легко выполнить. построить с помощью 'Fold':

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

Фраза '(# 2

Затем '&& # 1' объединяет результат для вашего текущего элемента с результатом для всех предыдущих элементов .

А «Истина» - это базовый случай - результат для пустого списка.

Чтобы увидеть, как это работает, вы можете передать некоторые неопределенные значения и посмотреть, до чего расширяется выражение:

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

Out[10]= c < 10 && b < 10 && a < 10
3
ответ дан 18 December 2019 в 10:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: