Как закодировать рекурсивную строку другим параметром в Ocaml - PullRequest
0 голосов
/ 12 октября 2018

Я хочу кодировать как string(2^n).

ex.

let string2 s = 
    match s with
    " " -> " "
    | _ -> s^s;;   

, но

let rec string128 s = 
    match s with 
      " " -> " " 
    | _ -> string128 s^s ;;

переполнено.Как я могу кодировать только с помощью рекурсивной функции?я не хочу использовать другой параметр.как `n -> n-1 '

, если я добавлю' a 'в строку128, затем повторю' a '128 раз.

1 Ответ

0 голосов
/ 12 октября 2018

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

let rec string128 s = if String.length s >= 128 then s else string128 (s^s);;

 let string128bis s =
   let orig_length = String.length s in
   let rec aux s =
     if String.length s >= 128 * orig_length then s else aux (s^s)
   in aux s;;

string128 будет объединять строки до тех пор, пока результат не станет не менее 128широкие символыstring128bis будет ожидать, что результирующая строка будет в 128 раз длиннее исходного ввода.И string128 "a", и string128bis a вернут 128 a, но string128 "abcd" вернет строку из 128 символов, повторяющую abcd, а string128bis "abcd" будет иметь длину 512 символов.

...