我正在尝试编写一个代码来检查数字是否是 ML 中的斐波那契。我是初学者。帮助我找出我的代码有什么问题。
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;
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
不能改变,所以条件要么总是真,要么总是假。如果您想使用这样的 while 循环,您应该查看ref
类型,它允许您创建可用于模拟可变变量的可变值。
也就是说,使用 while 循环和突变不是惯用的 SML。SML 中的变量不可变是有原因的:语言设计者希望鼓励您不要依赖突变(因此也不要依赖 while 循环)。在 SML 中循环的惯用方式是使用高阶函数(如map
、filter
等foldl
)或递归。对于您的问题,递归函数最有意义。