Рекурсивное решение перестановки - PullRequest
2 голосов
/ 25 декабря 2011

У меня есть структура данных, которая выглядит следующим образом:

[
  {:choices=>["Hello", "Hi"]}, 
  " ", 
  {:choices=>["wor", {:choices=>["ld", "d"]}, "there"]}, 
  ", says ", 
  "your ", 
  {:choices=>["friend", "amigo"]}
]

В этой структуре узлы выбора представляют собой набор возможных значений и могут быть составлены.

Мне нужен (возможно, рекурсивный) метод Ruby, который будет выводить массив всех возможных выходных данных. Т.е. для этого примера:

[
  "Hello word, says your friend",
  "Hello world, says your friend",
  "Hello there, says your friend",
  "Hi word, says your friend",
  "Hi world, says your friend",
  "Hi there, says your friend",
  "Hello word, says your amigo",
  "Hello world, says your amigo",
  "Hello there, says your amigo",
  "Hi word, says your amigo",
  "Hi world, says your amigo",
  "Hi there, says your amigo"
]

Я ожидаю, что это будет рекурсивно, но я уже час бьюсь головой об этом, и мне бы хотелось еще несколько глаз. Что мне здесь не хватает?

1 Ответ

1 голос
/ 25 декабря 2011

Пусть исходные данные будут a, я думаю, что вы хотели это:

def expand s, x = nil, *a
    case x
    when Hash then x[:choices].each{|x| expand(s, x, *a)}
    when Array then expand(s, *x, *a)
    when String then expand(s+x, *a)
    when nil then @combination << s
    end 
end

@combination = []
expand("", a)
@combination # => result

Но данные, которые вы предоставляете, неверны. Это не дает того, что вы хотите:

a = [
    {:choices=>["Hello", "Hi"]},
    " ",
    {:choices=>["wor", {:choices=>["ld", "d"]}, "there"]},
    ", says ",
    "your ",
    {:choices=>["friend", "amigo"]}
]

@combination = []
expand("", a)
@combination # =>
["Hello wor, says your friend",
 "Hello wor, says your amigo",
 "Hello ld, says your friend",
 "Hello ld, says your amigo",
 "Hello d, says your friend",
 "Hello d, says your amigo",
 "Hello there, says your friend",
 "Hello there, says your amigo",
 "Hi wor, says your friend",
 "Hi wor, says your amigo",
 "Hi ld, says your friend",
 "Hi ld, says your amigo",
 "Hi d, says your friend",
 "Hi d, says your amigo",
 "Hi there, says your friend",
 "Hi there, says your amigo"]

Если вы измените его на

a = [
    {:choices=>["Hello", "Hi"]},
    " ",
    {:choices=>[[
        "wor",
        {:choices=>["ld", "d"]}
    ], "there"]},
    ", says ",
    "your ",
    {:choices=>["friend", "amigo"]}
 ]

тогда вы получите:

@combination = []
expand("", a)
@combination # =>
["Hello world, says your friend",
 "Hello world, says your amigo",
 "Hello word, says your friend",
 "Hello word, says your amigo",
 "Hello there, says your friend",
 "Hello there, says your amigo",
 "Hi world, says your friend",
 "Hi world, says your amigo",
 "Hi word, says your friend",
 "Hi word, says your amigo",
 "Hi there, says your friend",
 "Hi there, says your amigo"]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...