我的几个朋友正在使用SML中的简单递归函数,到目前为止由于缺少SML文档及其语法而无法创建它。我试图找到一些东西来帮助他们,但到目前为止都没有成功。
这是我用Java创建的函数。它有效,我想将此功能的概念转换为SML。
private static int shift;
private static boolean firstRun = true;
private static void crackThatThing(int clearText, int cryptoText) {
if (firstRun) { // Make sure that the shift is only set once
firstRun = false;
shift = ((cryptoText % 10) - (clearText % 10)) % 10;
crackThatThing((clearText / 10), (cryptoText / 10));
} else {
if (clearText > 0 && cryptoText > 0) {
if (shift != ((cryptoText % 10) - (clearText % 10)) % 10) {
// The shift value changed - this is not a valid encryption!
System.out.println("This is not a valid encryption!");
} else {
// If the shift value is the same as before, continue with the next number
crackThatThing((clearText / 10), (cryptoText / 10));
}
} else {
// The encryption is valid
System.out.println("The encryption is valid. The shift is: " + shift);
}
}
}
有什么想法吗?
编辑:我认为应该是
以下代码完全基于以前没有任何SML经验,并且由于我实际删除了我编写的代码,这是基于我能记住的位。我知道这是错误的,很可能是可怕的代码,但请在这个问题上与我一起承担。
var notValid = "This is not a valid encryption!";
var valid = "The encryption is valid. The shift is: ";
var shift = 11; (* This is just to initialize it *)
var firstRun = true;
fun crackThatThing(clearText, cryptoText) =
if firstRun = true then
firstRun = false andalso
shift = ((cryptoText mod 10) - (clearText mod 10) mod 10) andalso
crackThatThing(clearText div 10, cryptoText div 10)
else
if clearText > 0 andalso cryptoText > 0 then
if not (shift = ((cryptoText mod 10) - (clearText mod 10) mod 10)) then
notValid
else
crackThatThing(clearText div 10, cryptoText div 10)
else
valid;
答案 0 :(得分:3)
网上有大量的书籍和资源(见下文)。
您需要函数div
和mod
,然后是一些通用的功能原则,例如递归来解决这个问题。
我不打算给你任何代码,因为它是每周一次的任务。但是,我非常乐意帮助解决与此任务无关的更具体问题。
链接
我见过的所有例子都只包含非常简单的if-else语句
然后我敢说你没看好!请参阅上面的链接列表,其中至少有一些链接包含不同级别的SML介绍。
与其他语言相比,SML的文档是荒谬的。
你并没有真正提到你正在谈论的文件,但我只能猜测它不是定义/评论。无论如何,你似乎不知道你在说什么!
我的朋友已经能够使用两个函数将其“转换”为SML而不是一个函数,但是当它应该非常简单时,这样做似乎很愚蠢。
确实,一旦理解了功能原则,它实际上非常简单。我再次高兴地就具体问题发表意见。
答案 1 :(得分:0)
从查看代码开始,我看到的主要内容是您尝试分配给变量(您编写的内容类似firstRun = false
,但=
实际上是等于运算符)。 ML中的变量不能分配给(因此“变量”是用词不当;它们在某种意义上实际上是常量)。您可以重新编写代码以不使用变异,也可以使用显式可变单元格(称为“引用”)。对于可变单元格,基本上,您使用ref
函数创建具有给定初始值的可变单元格。您使用!
运算符来获取单元格的值;并使用:=
运算符更改单元格内的值。
但是,我认为在您的情况下使用可变全局状态是个坏主意。这是糟糕的风格,它似乎会使你的功能不能使用多次。从我所看到的,您在对函数进行递归调用时使用全局变量来跟踪信息。您可以改为定义一个执行递归的内部函数(外部函数的本地函数),这样您就可以跟踪外部函数的局部变量中的东西和/或在递归内部函数时传递其他变量,而不会暴露陈述全球范围。
此外,您不会使用var
声明变量;你可能想要val