5

我试图在非递归阶乘函数中从 6 倒数到 1 并得到编译器错误:

let fact x =
    let mutable product = 1
    for i in x..-1..1 do
        product <- product * i
    product

// Error on the 6 - type 'int' does not support the operator '..-'
let answer = fact 6
printfn "%i" answer

我从这里的底部附近得到了这个想法

已将功能更改为仅计数并且可以正常工作,但是我很想知道为什么会失败。有没有更好的倒计时方法?

使用VS2012更新3

4

3 回答 3

17

已将功能更改为仅计数并且可以正常工作,但是我很想知道为什么会失败。

您的示例失败,因为..and-是两个不同的运算符,编译器需要将它们分开。-1您可以添加空格,而不是用括号括起来:

let fact x =
    let mutable product = 1
    for i in x .. -1 .. 1 do
        product <- product * i
    product

有没有更好的倒计时方法?

不太知名的for .. downto .. do结构更适合在这里使用。

let fact x =
    let mutable product = 1
    for i = x downto 1 do
        product <- product * i
    product
于 2013-07-30T16:19:03.960 回答
8

这有效:

let fact x =
  let mutable product = 1
  for i in x..(-1)..1 do
    product <- product * i
  product

与此一样(如问题链接中所用):

let fact x =
  let mutable product = 1
  for i in x .. -1 .. 1 do
    product <- product * i
  product

PS:另请注意,计算阶乘有更多功能方法(使用可变变量不好);最明显的使用递归:

let rec fact x =
  if x > 2
  then x * (fact (x - 1))
  else x

或使用列表的单线:

let fact x = [2..x] |> List.reduce (*)
于 2013-07-30T16:07:50.200 回答
4

尝试使用括号:

...
for i in x..(-1)..1 do
...
于 2013-07-30T16:07:39.130 回答