【问题标题】:Check whether number is Fibonacci or not in Standard ML在标准 ML 中检查数字是否为斐波那契
【发布时间】:2013-09-16 06:16:59
【问题描述】:

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

【问题讨论】:

  • 也许如果您描述您当前的问题,它会更容易为您提供帮助。

标签: sml smlnj


【解决方案1】:
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 &lt; n 这样的while 条件也没有意义,因为a2n 不能改变,所以条件要么总是真要么总是假。如果您想使用这样的 while 循环,您应该查看 ref 类型,它允许您创建可用于模拟可变变量的可变值。

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

【讨论】:

    猜你喜欢
    • 2017-02-13
    • 2014-03-15
    • 1970-01-01
    • 1970-01-01
    • 2011-09-10
    • 2012-11-09
    • 1970-01-01
    • 2012-12-29
    • 2017-03-31
    相关资源
    最近更新 更多