Создание собственных функций подстановки в Ocaml - PullRequest
1 голос
/ 23 января 2012

Как я могу написать функцию подстроки в ocaml без использования списков назначений и итераций, только рекурсии? я могу использовать только string.length.

я пробовал до сих пор

let substring s s2 start stop=
if(start < stop) then 
    substring s s2 (start+1) stop
    else s2;;

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

Ответы [ 2 ]

2 голосов
/ 23 января 2012

Это похоже на проблему с домашним заданием, которая предназначена для того, чтобы научить вас думать о рекурсии.Для меня было бы проще подумать о рекурсивной части, если вы определитесь с основными операциями, которые собираетесь использовать.Вы не можете использовать назначения, списки или итерации, хорошо.Вам нужно каким-то образом извлечь части вашей входной строки, но вы, очевидно, не можете использовать встроенную функцию подстроки для этого, что противоречило бы цели упражнения.Единственная другая операция, о которой я могу подумать, это та, которая извлекает один символ из строки:

# "abcd".[2];;
- : char = 'c'

Вам также нужен способ добавить символ в строку, давая более длинную строку.Но вы не можете использовать назначение, чтобы сделать это.Мне кажется, вам придется использовать String.make для перевода вашего символа в строку:

# String.make 1 'a';;
- : string = "a"

Затем вы можете объединить две строки, используя оператор ^:

# "abc" ^ "def"
- : string = "abcdef"

Вам разрешено использовать эти три операции?Если это так, вы можете начать думать о рекурсивной части проблемы подстроки.Если нет, то я, вероятно, недостаточно хорошо понимаю проблему, чтобы дать совет.(Или, может быть, тот, кто установил ограничения, не ожидал, что вам придется вычислять подстроки? Обычно ограничения также являются своего рода подсказкой о том, как вам следует действовать.)

Переходя к конкретному вопросу.Начиная программирование на FP, вы обычно не хотите передавать ответ на рекурсивные вызовы.Вы хотите передать меньшую проблему рекурсивному вызову и получить от нее ответ back .Для проблемы подстроки, примером меньшей проблемы является запрос подстроки, которая начинается на один символ дальше в содержащей строке, и это на один символ короче.

(Позже вы можете передатьчастичные ответы на ваши рекурсивные вызовы, чтобы получить хвостово-рекурсивное поведение. Я говорю, пока не беспокойтесь об этом.)

0 голосов
/ 24 января 2012

Теперь я не могу дать вам ответ на этот вопрос, отчасти потому, что это ваша домашняя работа, а отчасти потому, что прошло 3 года с тех пор, как я коснулся синтаксиса OCaml, но я могу попытаться помочь вам в этом.* Теперь основной принцип рекурсии - разбить проблему на более мелкие версии.

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

...