2012-01-23 38 views
-1

我想实现一个检查函数,给定两个字符串s1s2将检查s2是否是caesar cipher of s1或不。内部面孔需要看起来像string->string->boolcaesar cipher check in ocaml

问题是我不允许使用除String.length之外的任何字符串函数,那么我该如何解决它?我不允许任何list arrayiterations。只有recursionspattern matching

请帮帮我。你也可以告诉我如何在ocaml中编写一个子字符串函数,而不是具有上述限制的模块函数吗?

+1

这是一项家庭作业吗?你试过什么了? – chrisaycock

+0

@pad,我在回答中给出了代码,因为字符是有限的。让检查S1 S2 = \t(*字母映射表*) \t字符串键= “ABCD” \t(*映射*) \t字符串mapping_cipher = “农发行” \t如果string.length减S1!= string.length减S2 \t \t引发异常; \t else \t \t match s1。[0]与 –

+0

(*在密钥字符串中的一些字母,并从密钥字符串中获得索引i,并与mapping_cipher [i]匹配s2。[0],我可以写一些函数并在这里调用?将适用于?@chrisaycock \t \t \t \t *) \t \t \t \t(*我怎样才能通过字符串键导航递归没有特别的字符串函数和迭代? \t \t例如我怎么能做到这一点保持格式与字符串>与字符串>布尔? \t \t以及如果我递归调用我怎样才能调用递归函数w ith s1和s2的其余部分如果string.sub不允许? \t \t我甚至不知道s1。[0]将是合法的,因为它也是一个字符串操作。 \t \t \t \t \t \t *) –

回答

1

我的猜测是,你可能被允许使用s.[i]来获得字符串s的第i个字符。这与String.get相同,但教师可能不会这样想。如果没有某种形式的字符串获取单个字符,我相信这是不可能的。你应该仔细检查一下你的老师是否确定,但是如果他的意思是你无法将字符串分隔成字符(这是你在Ocaml中独自使用模式匹配时无法做到的),我会感到惊讶。

一旦你可以获得单个字符,其实现方式应该很清楚(你不需要用substring递归地遍历每个字符串)。

如果你还想编写子串,创建它将会很复杂,因为你没有访问String.create或其他类似的功能。但是你可以使用递归编写自己的String.create版本,一个字符字符串文字(如"x"),能够将字符串中的字符设置为另一个(如s.[0] <- c)和字符串连接(s1^s2)。当然,所有这些都假设允许使用这些运营商。

+0

嗯我想是的。但在这种情况下,我可能不会使用string.create函数为新的子字符串。我是ocaml的新手。没有转换变量或使用assignemnt如何创建一个子字符串呢? –

+0

这是我没有想到的子串。 (请注意,您不需要子字符串来回答主要问题,尽管我当然可以明白为什么您需要它。)我已经修改了答案来解决该问题。 –