Mathematica, алфавит поколения - PullRequest
5 голосов
/ 05 декабря 2011

Если у меня есть алфавит, скажем, sigma = {1,2,3,4, a, b, c, d, e, f, g} и хочу сгенерировать все слова длины n, есть ли способ сделать это?

Я могу сделать Flatten[Outer[Function[{x, y}, {x, y}], sigma, sigma], 1], чтобы сделать это для wordlength = 2, но это не geenralize для большего количества букв. И перестановки не работают, так как они не включают в себя двойные. Permutations[sigma, {2}] не дает {a, a}, например.

Есть ли простой способ сделать это, или я должен написать для него функцию?

Это верно для n = 2 (но я хочу для произвольного n):

{{1, 1}, {1, 2}, {1, 3}, {1, 4}, {1, a}, {1, b}, {1, c}, {1, d}, {1, 
  e}, {1, f}, {1, g}, {2, 1}, {2, 2}, {2, 3}, {2, 4}, {2, a}, {2, 
  b}, {2, c}, {2, d}, {2, e}, {2, f}, {2, g}, {3, 1}, {3, 2}, {3, 
  3}, {3, 4}, {3, a}, {3, b}, {3, c}, {3, d}, {3, e}, {3, f}, {3, 
  g}, {4, 1}, {4, 2}, {4, 3}, {4, 4}, {4, a}, {4, b}, {4, c}, {4, 
  d}, {4, e}, {4, f}, {4, g}, {a, 1}, {a, 2}, {a, 3}, {a, 4}, {a, 
  a}, {a, b}, {a, c}, {a, d}, {a, e}, {a, f}, {a, g}, {b, 1}, {b, 
  2}, {b, 3}, {b, 4}, {b, a}, {b, b}, {b, c}, {b, d}, {b, e}, {b, 
  f}, {b, g}, {c, 1}, {c, 2}, {c, 3}, {c, 4}, {c, a}, {c, b}, {c, 
  c}, {c, d}, {c, e}, {c, f}, {c, g}, {d, 1}, {d, 2}, {d, 3}, {d, 
  4}, {d, a}, {d, b}, {d, c}, {d, d}, {d, e}, {d, f}, {d, g}, {e, 
  1}, {e, 2}, {e, 3}, {e, 4}, {e, a}, {e, b}, {e, c}, {e, d}, {e, 
  e}, {e, f}, {e, g}, {f, 1}, {f, 2}, {f, 3}, {f, 4}, {f, a}, {f, 
  b}, {f, c}, {f, d}, {f, e}, {f, f}, {f, g}, {g, 1}, {g, 2}, {g, 
  3}, {g, 4}, {g, a}, {g, b}, {g, c}, {g, d}, {g, e}, {g, f}, {g, g}}

Ответы [ 2 ]

16 голосов
/ 05 декабря 2011
5 голосов
/ 06 декабря 2011

Хотя Tuples, безусловно, лучший путь, я думаю, что полезно показать вам способ заставить ваш существующий метод работать с произвольными n значениями.

Flatten[Outer[List, ##], n - 1] & @@ ConstantArray[sigma, n]

Это работает путем создания n экземпляров sigma и упорядочения (##) их в Outer. Flatten используется для удаления всех, кроме последнего уровня скобок.

Обратите внимание, что ваш Function[{x, y}, {x, y}] может быть заменен просто List.

Вы также можете использовать для этого функцию Distribute, предполагая, что ваш алфавит не содержит списков.

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