如何在Ocaml中编码递归字符串其他参数

时间:2018-10-12 11:12:25

标签: recursion functional-programming ocaml

我想要像string(2^n)这样的代码。

例如

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

但是

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

它溢出了。如何仅使用递归函数进行编码? 我不想使用其他参数。就像“ n-> n-1”

如果我在字符串128中放入“ a”,然后重复“ a” 128次。

1 个答案:

答案 0 :(得分:1)

我不确定您为什么不想使用额外的参数,但是您可以将字符串的长度用作终止条件。由于不清楚要对包含多个字符的初始字符串要做什么,因此有两种可能的版本:

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个字符长。