Вопрос карты Mathematica - PullRequest
       15

Вопрос карты Mathematica

0 голосов
/ 08 ноября 2010

Оригинальный вопрос:

Я знаю, что в Mathematica есть встроенная карта (f, x), но как эта функция выглядит? Я знаю, что вам нужно посмотреть на каждый элемент в списке.

Любая помощь или предложения?

Правка (Джефроми, собрана из комментариев Майка):

Я работаю над программой, которая должна перемещаться по списку, подобному карте, но мне не разрешено ее использовать. Мне также не разрешено использовать Table; Мне нужно перемещаться по списку без помощи другой функции. Я работаю над рекурсивной версией, у меня есть пустой список внизу, но перемещение по списку с элементами в нем не работает. Вот мой первый случай: newMap[#, {}] = {} (карта пустого списка - это просто пустой список)

Ответы [ 2 ]

6 голосов
/ 08 ноября 2010

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

Вы находитесь напуть к рекурсивному решению с вашим определением newMap[f_, {}] := {}.

Сопоставление с образцом Mathematica - ваш друг.Подумайте, как вы можете реализовать определение для newMap[f_, {e_}], а оттуда newMap[f_, {e_, rest___}].

Последний совет: если вы можете определить эту последнюю функцию, вам на самом деле не нужен регистр для {e_}.

ОБНОВЛЕНИЕ :

Исходя из ваших комментариев, возможно, этот пример поможет вам понять, как применить произвольную функцию:

func[a_, b_] := a[b]

In[4]:= func[Abs, x]
Out[4]= Abs[x]

РЕШЕНИЕ

Поскольку ОП поймал рыбу,говоря, (поздравляю!) вот два рекурсивных решения, чтобы удовлетворить любопытство любых зрителей.Вероятно, это первое, что я бы назвал «идиоматическим» Mathematica:

map1[f_, {}] := {}
map1[f_, {e_, rest___}] := {f[e], Sequence@@map1[f,{rest}]}

Вот подход, который не использует сопоставление с образцом в достаточной степени, что в основном и привело к тому, что OP закончился:

map2[f_, {}] := {}
map2[f_, lis_] :=  {f[First[lis]], Sequence@@map2[f, Rest[lis]]}

Часть {f[e], Sequence@@map[f,{rest}]} может быть выражена различными эквивалентными способами, например:

  • Prepend[map[f, {rest}], f[e]]
  • Join[{f[e]}, map[f, {rest}] (@Mike использовал этометод)
  • Flatten[{{f[e]}, map[f, {rest}]}, 1]

Я предоставлю читателю возможность больше думать и размышлять над влиянием большинства из них на производительность =)

Наконец, для забавы, вот процедурная версия, хотя ее написание сделало меня немного тошнотворным:; -)

map3[f_, lis_] :=
 (* copy lis since it is read-only *)
 Module[{ret = lis, i},
  For[i = 1, i <= Length[lis], i++,
   ret[[i]] = f[lis[[i]]]
   ];
  ret
  ]
1 голос
/ 08 ноября 2010

Чтобы ответить на вопрос, который вы задали в комментариях, первый аргумент в Map - это функция, которая принимает один аргумент.Это может быть чистая функция или имя функции, которая уже принимает только один аргумент, например

In[1]:=f[x_]:= x + 2
       Map[f, {1,2,3}]
Out[1]:={3,4,5}

о том, как заменить Map рекурсивной функцией вашего собственного изобретения ...Пример Джефроми, я не собираюсь слишком много отдавать, потому что это домашнее задание.Но вам, очевидно, потребуется какой-то способ работы с частью списка, сохраняя остальную часть списка без изменений для рекурсивной части вашей функции отображения.По его словам, Part является хорошей отправной точкой, но я бы посмотрел на некоторые другие функции, на которые он ссылается, и выяснил, являются ли они более полезными, например, First и Rest.Кроме того, я вижу, где Flatten было бы полезно.Наконец, вам понадобится способ завершить рекурсию, поэтому изучение способов ограничения шаблонов может оказаться полезным.Кстати, это можно сделать в одну или две строки в зависимости от того, создаете ли вы второе определение для вашей карты (более простой способ), или нет.

Подсказка : Теперь, когда у вас естьВ конечном состоянии вам нужно ответить на три вопроса:

  1. как извлечь один элемент из моего списка,
  2. , как мне сослаться на остальные элементы списка, и
  3. как мне собрать его вместе?

Это помогает подумать об одном шаге в процессе, и что вам нужно сделать на этом шаге.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...