我想要像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次。
答案 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个字符长。