我正在尝试编写一个代码,用于检查ML中的数字是否为Fibonacci。我是初学者。帮我看看我的代码有什么问题。
fun isfib(n :int): bool=
let
val a1=1;
val a2=1;
val temp=0;
in
while a2<n do (
a1=temp
a2=a1
a2=temp+a2
)
if a2=n then true
else false
end;
答案 0 :(得分:0)
a1=temp
a2=a1
a2=temp+a2
=
是SML中的相等运算符,而不是赋值运算符。所以上面的代码就等同于:
false (* because a1 is 1, but temp is 0 *)
true (* because a1 and a2 are both 1 *)
true (* because 1 = 0 + 1 *)
所以你的循环中有三个无副作用的表达式,所以它不会做任何事情。
很明显,您确实想要更改这些变量的值,但是您不能这样做。 SML中的变量是不可变的 - 您在设置后无法更改它们。因此,即使像a2 < n
这样的条件也没有意义,因为a2
和n
无法更改,因此条件要么始终为true,要么始终为false。如果你想使用像这样的while循环,你应该查看ref
类型,它允许你创建可用于模拟可变变量的可变值。
那说使用while循环和变异不是惯用的SML。 SML中的变量不可变是有原因的:语言设计者希望鼓励你不要依赖变异(因此也不要依赖于while循环)。在SML中循环的惯用方法是使用更高阶函数(如map
,filter
,foldl
等)或递归。对于你的问题,递归函数最有意义。