Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String ocaml中的凯撒密码检查_String_Ocaml_Substring - Fatal编程技术网

String ocaml中的凯撒密码检查

String ocaml中的凯撒密码检查,string,ocaml,substring,String,Ocaml,Substring,我想实现一个检查函数,给定两个字符串s1和s2将检查s2是否为s1的caesar密码。界面需要看起来像string->string->bool 问题是,除了string.length,我不允许使用任何字符串函数,因此如何解决它?我不允许使用任何列表数组,迭代。只有递归和模式匹配 请帮帮我。您还可以告诉我如何在ocaml中编写子字符串函数,而不是具有上述限制的模块函数吗?我猜您可能可以使用s.[I]来获取字符串s的第I个字符。这与String.get相同,但讲师可能不会用这些术语来考虑它。如果没有

我想实现一个检查函数,给定两个字符串
s1
s2
将检查
s2
是否为s1的
caesar密码。界面需要看起来像
string->string->bool

问题是,除了
string.length
,我不允许使用任何字符串函数,因此如何解决它?我不允许使用任何
列表数组
迭代
。只有
递归
模式匹配


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

我猜您可能可以使用
s.[I]
来获取字符串s的第I个字符。这与String.get相同,但讲师可能不会用这些术语来考虑它。如果没有某种形式的获取字符串的单个字符,我相信这是不可能的。您可能应该与您的讲师再次确认,但如果他想让您无法将字符串拆分为字符(这是Ocaml中单独使用模式匹配无法做到的),我会感到惊讶

一旦您可以获得单个字符,完成的方法应该非常清楚(您不需要子字符串来递归遍历每个字符串)


如果您仍然想编写子字符串,创建它会很复杂,因为您无法访问String.create或其他类似函数。但是您可以编写自己版本的字符串。使用递归创建,一个字符串文字(如
“x”
),能够将字符串中的字符设置为另一个字符(如
s)[0]这是家庭作业吗?到目前为止您尝试了什么?@pad,由于字符有限,我在回答中给出了代码。让我们检查s1 s2=(*字母表映射表*)string key=“ABCD”(映射)string mapping_cipher=“CADB”如果string.length s1!=string.length s2引发异常;否则将s1.[0]与(*键字符串中的某个字母匹配,并从键字符串中获取索引i,并将s2.[0]与映射_cipher匹配。[i],我可以在这里编写一些函数和调用吗?是否合适?@chrisaycock*)(*我如何在没有特定字符串函数和迭代的情况下递归地浏览字符串键?例如,我如何保持格式string->string->bool?如果我递归调用,如果string.sub不允许,我如何使用s1和s2的其余部分调用递归函数?我甚至不知道s1。[0]将是合法的,因为它也是一个字符串操作。*)您是否在问两个独立的问题?(1.如何编写caesar密码检查函数和2.如何编写子字符串函数)如果是这样的话,你应该分别询问另一个。你似乎对OCaml中的类型非常困惑。
string->string->bool
,对于OCaml程序员来说,这意味着一个函数接受两个字符串参数并返回一个布尔值。(由于使用curry,它实际上是一个单参数函数,返回一个接受其余参数的函数。如果您不理解这一点,您需要停止并阅读有关curry的内容。)因此,我认为不需要生成子字符串(只需返回布尔值)或者进行递归调用或诸如此类的操作。是的,我想是这样。但在这种情况下,我可能不会为新的子字符串使用string.create函数。我对ocaml是新手。如果不标记变量或使用赋值,我怎么能创建子字符串呢?这是我在子字符串中没有想到的。(请注意,您不需要使用子字符串来回答主要问题,尽管我当然明白您为什么需要它。)我已修改了答案以解决该问题。