#haskell
#haskell
Вопрос:
Мне нужно сгенерировать все слова из 3 букв, по крайней мере, с 1 гласной. Я уже создал код для генерации всех слов из 3 букв, но я не могу найти, как сделать каждое слово с 1 гласной или более. Это мой код:
alfabeto = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
alfabeto2 = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
alfabeto3 = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z"]
small = [alfabeto alfabeto2 alfabeto3 | alfabeto <- alfabeto, alfabeto2 <- alfabeto2, alfabeto3 <- alfabeto3]
Комментарии:
1. Начните с создания слов из трех символов, которые начинаются с гласной, а затем двух символов, затем гласной в середине, а затем гласной в конце.
2. Кстати, нет необходимости повторять один и тот же список три раза в коде. Просто определите его один раз и используйте
[ x y z | x <- alfabeto, y <- alfabeto, z <- alfabeto ]
3. @WillemVanOnsem Проблема в том, что первые 10 слов должны быть: [«aaa», «aab», «aac», «aad», «aae», «aaf», «aag», «aah», «aai», «aaj»] и таким образом нене работает.
4. @chi Ty, это очень помогло
5. @JohnSmith: Я бы не стал беспокоиться об этом в данный момент, сначала попробуйте попрактиковаться с некоторыми связанными проблемами.
Ответ №1:
Мы можем определить два алфавита, один с только гласными, а другой со всеми символами:
vowels :: [Char]
vowels = "aeiouy"
letters :: [Char]
letters = [ 'a' .. 'z' ]
теперь для результата два первых символа могут быть выбраны как из letters
списка, так как независимо от того, что мы выбираем, для последнего символа мы можем выбрать гласную, оба из которых не являются гласными.
Таким образом, мы можем определить функцию, которая, учитывая первые два символа, возвращает список гласных (если оба символа не являются гласными) или список букв (если хотя бы один из символов является гласным). Эта функция выглядит так:
pickThird :: Char -> Char -> [Char]
pickThird la lb
| … = letters
| otherwise = vowels
где вам все еще нужно заполнить …
часть.
Теперь мы можем использовать это для понимания списка, который выглядит следующим образом:
words3 :: [String]
words3 = [ [la, lb, lc] | la <- letters, lb <- letters, lc <- pickThird la lb ]
таким pickThird
образом, в зависимости от выбора la
и lb
либо возвращает список всех букв, либо только гласных.