【问题标题】:Unexpected output from function in HaskellHaskell中函数的意外输出
【发布时间】:2021-07-31 08:39:46
【问题描述】:

我有这个函数,它接受一个整数 n,并返回小于的整数个数 n 与 n 互质。我不知道我的代码可能在哪里失败,因为我认为我检查了它工作所需的一切。

我希望得到这样的输出:

eTotient 73 = 72

但我有一个看起来像这样的:

eTotient 73 = [2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64,65,66,67,68,69,70,71,72]

这是我的代码:

divisorCoPrime :: Int -> [Maybe Int]
divisorCoPrime n = divisorCoPrime2 n n

divisorCoPrime2 :: Int -> Int -> [Maybe Int]
divisorCoPrime2 n 1 = []
divisorCoPrime2 n x
    | divides n x && isPrime x = Just x:divisorCoPrime2 n (x-1)
    | otherwise = divisorCoPrime2 n (x-1)

isCoprime :: Int -> Int -> Bool
isCoprime x y = isCoprime2 (divisorCoPrime x) (divisorCoPrime y)

isCoprime2 :: [Maybe Int] -> [Maybe Int] -> Bool
isCoprime2 [] y = True
isCoprime2 x [] = True
isCoprime2 (x:xs) y
    | foldl (||) False (map (x==) y) = False
    | otherwise = isCoprime2 xs y
    
eTotient :: Int -> [Int]
eTotient n = filter (isCoprime n ) [2..(n-1)]

【问题讨论】:

  • eTotient :: Int -> [Int] 表示eTotient 返回一个整数的列表 ([Int])
  • 我怎样才能让它只返回一个Int
  • 您有一个非常有趣的函数,名为isCoprime。它有什么作用?

标签: haskell primes type-signature


【解决方案1】:

根据Wikipedia

欧拉的 totient 函数 [我猜 eTotient 应该是] 计算正整数,直到给定整数 nn 相对质数

filter (isCoprime n ) [2..(n-1)] 是此类整数的 list,但您需要这些整数的 number - 列表的 length。假设其余的代码是正确的,它看起来像这样:

eTotient :: Int -> Int
eTotient n = length $ filter (isCoprime n ) [2..(n-1)]

【讨论】:

  • 为了让它按我的意愿工作,我必须将2 更改为1。非常感谢您的帮助!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-06
  • 2017-07-28
  • 1970-01-01
  • 2022-10-17
  • 1970-01-01
  • 2023-01-25
相关资源
最近更新 更多