我试图在非递归因子函数中从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
我从底部here
附近得到了这个想法已将功能更改为仅计数并且可以正常工作,但我很想知道为什么会失败。有更好的倒计时方法吗?
使用VS2012更新3
答案 0 :(得分:17)
已将功能更改为仅计数并且有效,但我有兴趣知道为什么会失败。
您的示例失败,因为..
和-
是两个不同的运算符,编译器需要将它们分开。您可以添加空格,而不是用括号括起-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
答案 1 :(得分: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 (*)
答案 2 :(得分:4)
尝试使用括号:
...
for i in x..(-1)..1 do
...