0

我正在尝试编写一个代码来检查数字是否是 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;
4

1 回答 1

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不能改变,所以条件要么总是真,要么总是假。如果您想使用这样的 while 循环,您应该查看ref类型,它允许您创建可用于模拟可变变量的可变值。

也就是说,使用 while 循环和突变不是惯用的 SML。SML 中的变量不可变是有原因的:语言设计者希望鼓励您不要依赖突变(因此也不要依赖 while 循环)。在 SML 中循环的惯用方式是使用高阶函数(如mapfilterfoldl)或递归。对于您的问题,递归函数最有意义。

于 2013-09-15T22:06:00.167 回答