Обновление
Хорошо, рекурсивная версия не так уж и плоха. И на самом деле, он может быть почти таким же чистым, как оригинальное нерекурсивное решение ниже.
const toPigLatin = (str, prefix) =>
(!str) || 'aeiou' .includes (str [0])
? str + prefix + (prefix.length ? '' : 'w') + 'ay'
: toPigLatin (str.slice(1), prefix + str[0])
const translatePigLatin = (str) => toPigLatin (str, '')
console .log (['california', 'glove', 'algorithm', 'gypsy'] .map (translatePigLatin))
Хотя это также можно записать без вспомогательной функции, используя параметр по умолчанию, например:
const translatePigLatin = (str, prefix = '') =>
(!str) || 'aeiou' .includes (str [0])
? str + prefix + (prefix.length ? '' : 'w') + 'ay'
: translatePigLatin (str.slice(1), prefix + str[0])
, это может иметь некоторые странные эффекты, если кто-то передал дополнительные параметры, как при вызове map
.
console .log (['california', 'glove', 'algorithm', 'gypsy'] .map (translatePigLatin))
//=> ["alifornia0cay","ove1glay","algorithm2way","3gypsyay"]
Обойти это можно, заключив параметр в лямбду в map
, например:
console .log (['california', 'glove', 'algorithm', 'gypsy'] .map (s => translatePigLatin(s)))
//=> ["aliforniacay","oveglay","algorithmway","gypsyay"]
Но вы никогда не можете быть уверены, что это не вызовет проблем. Это постоянная проблема с такими параметрами по умолчанию.
Обновление до обновления
Эта альтернатива может быть немного чище:
const toPigLatin = (base, prefix, suffix) =>
base .length == 0 || 'aeiou' .includes (base [0])
? base + prefix + suffix
: toPigLatin (base .slice (1), prefix + base [0], 'ay')
const translatePigLatin = (str) => toPigLatin (str, '', 'way')
Оригинальный ответ
(Это быстро устарело!)
Этот нерекурсивный ответ кажется более простым и прямым, чем любой рекурсивный ответ:
const translatePigLatin = str => {
const idx = str .split ('') .findIndex (c => 'aeiou' .includes (c))
return idx == 0
? str + 'way'
: idx < 0
? str + 'ay'
: // else
str .slice (idx) + str .slice (0, idx) + 'ay'
}
console .log (['california', 'glove', 'algorithm', 'gypsy'] .map (translatePigLatin))
(нам также может понадобиться .toLowerCase()
там.)
Вы ищете рекурсивное решение, потому что думаете, что оно будет проще или потому что это кажется центральной проблемой?