代码之家  ›  专栏  ›  技术社区  ›  Nils

F中的素因子#

  •  1
  • Nils  · 技术社区  · 16 年前


    我写了一个计算素数的函数。

    let PrimeFactors x =
      let rec PrimeFactorsRecursive x div list =
         if x % div = 0 then PrimeFactorsRecursive (x/div) div list @ [div]
         elif div > int(System.Math.Sqrt(float(x))) then 
           if x > 1 then list @ [x]
           else list
         else PrimeFactorsRecursive x (div + 1) list
      PrimeFactorsRecursive x 2 []
    

    有没有“更”实用的方法来编写这段代码?

    3 回复  |  直到 16 年前
        1
  •  3
  •   Yin Zhu    16 年前

    代码中的主要问题是 @ 合并两个列表。合并两个列表需要线性时间,而不是固定时间。

    :: 操作员如下所示:

    let primeFactors x = 
        let rec fact x div list = 
            if x % div = 0 then
                fact (x/div) div (div::list)
            elif div > int(sqrt (float x)) then
                if x > 1 then x::list
                else list
            else
                fact x (div+1) list
        fact x 2 []
    

    阿尔索 let 绑定值通常遵循camleStyle命名转换。

        2
  •  1
  •   Stephen Swensen    16 年前

    int(System.Math.Sqrt(float(x)))
    

    你有

    (x |> float |> sqrt |> int)
    
        3
  •  0
  •   Gian    16 年前

    您可能可以使用保护模式来减少if表达式嵌套。除此之外,在我看来,它是非常合理的惯用函数代码。