Recursion 如何在Ocaml中编写递归字符串和其他参数

Recursion 如何在Ocaml中编写递归字符串和其他参数,recursion,functional-programming,ocaml,Recursion,Functional Programming,Ocaml,我想像string(2^n)那样编码 前 但是, 它已溢出。如何仅使用递归函数编写代码? 我不想使用其他参数。像'n->n-1' 如果我在字符串128中放入“a”,然后重复“a”128次。我不确定您为什么不想使用额外的参数,但您可以使用字符串的长度作为终止条件。由于不清楚如何处理具有多个字符的初始字符串,因此这里有两种可能的版本: let rec string128 s = if String.length s >= 128 then s else string128 (s^s);;

我想像
string(2^n)
那样编码

但是,

它已溢出。如何仅使用递归函数编写代码? 我不想使用其他参数。像'n->n-1'


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

我不确定您为什么不想使用额外的参数,但您可以使用字符串的长度作为终止条件。由于不清楚如何处理具有多个字符的初始字符串,因此这里有两种可能的版本:

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

It“溢出”因为任何字符串与自身的串联都不会产生
”的基本大小写,所以它将无限递归。因为“like
string(2^n)
”没有任何意义,所以不清楚您试图做什么。如果您可以提供一些输入示例和函数的预期输出,则可能可以破译您想要完成的任务,但否则您必须实际尝试解释它。如果我在string128中输入“a”,则重复“a”128次。这就是我想做的。好吧,这更有意义。你能更新你的问题以包括那个例子吗?我更新了。在基本情况下,我应该更改什么?我可能不太理解,但为什么不使用另一个参数呢?字符串是常量,它没有递归函数可以用来知道何时停止的其他信息?
let rec string128 s = 
    match s with 
      " " -> " " 
    | _ -> string128 s^s ;;
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;;