2011-04-19 50 views
1

这里是我试图去上班最后一行的代码是它失败:F#失败“错误这种表达预计将有一个int类型,但这里的类型为int - >诠释”

let rec gcd a b = 
    if b= 0 then 
     a 
    else 
     gcd b (a % b);; 

let n = 8051 
let mutable d = 0 
let mutable c = 1 
let mutable xi = 2 
let mutable yi = 2 
let f x = (pown x 2) + (c % n);; 
while c < 100 do 
    while d = 1 do 
     xi <- (f xi) 
     yi <- (f(f(yi))) 
     printfn "%d%d" xi yi   
     d <- gcd(abs (xi - yi) n) 

---------------------以下代码有效;除了在N个整数溢出---------

module Factorization 


let rec gcd a b = 
    if b= 0 then 
     a 
    else 
     gcd b (a % b);; 

let n = 600851475143N 
let mutable d, c, xi, yi = 1, 1, 2, 2 
let f x = (pown x 2) + (c % n);; 

let maxN m =int(ceil(sqrt(float m))) 
//if (n > maxN(xi)) && (n > maxN(yi)) then 
while c < 100 do 
    d <- 1 
    while d = 1 do   
     if (maxN(n) > xi) && (maxN(n) > yi) then 
      xi <- f xi 
      yi <- f(f(yi))   
      d <- gcd (abs (xi - yi)) n 
      //fail 
      if d = n then d<-1 
      if d <> 1 then printfn "A prime factor of %d x = %d, y = %d, d = %d" n xi yi d 
     else 
      xi <- 2 
      yi <- 2 
      c <- c + 1;; 
+1

我认为你永远不会执行最后一行,因为你正在将d初始化为0,但是执行'while d = 1' :) – 2011-04-19 20:29:58

+1

有趣的是,他不会经常执行最后一行infinitly,因为c永远不会改变,所以仍然是1,这是<100 – Ingo 2011-04-19 20:39:47

+0

在测试ingo中发现 – n8CodeGuru 2011-04-21 16:04:13

回答

2

除了什么@Rangoric指出,外支架必须去,否则也柯里将无法正常工作:

d <- gcd (abs(xi-yi)) n 
+0

这就是我错过的!谢谢 – n8CodeGuru 2011-04-19 20:31:01

1

尝试:

d <- gcd (abs(xi-yi)) n 

据指出ABS是内部 - > int和本身不是一个int。用圆括号括起来会导致abs在gcd看它之前被执行。这导致gcd看到abs的结果而不是abs本身。

+0

我试过,在我发布之前,它没有工作:(我得出的结论是,它返回一个函数,而不是一个值。如下:d <-gcd((abs(xi-yi))n)和d <-gcd((abs(xi-yi))()n) – n8CodeGuru 2011-04-19 20:29:03

+0

删除了parens,这就是我没有先尝试它 – Rangoric 2011-04-21 14:00:26

2

哎呀,这里有一些不请自来的建议(@BrokenGlass回答了这个问题本身正确)。

首先,你可以指定所有这些mutables在一行:

let mutable d, c, xi, yi = 0, 1, 2, 2 

其次,去容易对括号:

xi <- f xi 
yi <- f (f yi) 

,当然还有,尽量摆脱mutables和while循环。但我会把它留给你,因为我确信你知道你使用递归实现了gcd