检查标准ML中的数字是否为Fibonacci

时间:2013-09-15 20:52:07

标签: sml smlnj

我正在尝试编写一个代码,用于检查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;

1 个答案:

答案 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这样的条件也没有意义,因为a2n无法更改,因此条件要么始终为true,要么始终为false。如果你想使用像这样的while循环,你应该查看ref类型,它允许你创建可用于模拟可变变量的可变值。

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

相关问题