--對于能被15整除的數字,我們可以很容易地得到它
take 10 [x | x <- [1..] , x `mod` 15 == 0 ]
--但是對于所有我如何使用 all 選項
take 10 [x | x <- [1..] , x `mod` [2..15] == 0 ]
take 10 [x | x <- [1..] , all x `mod` [2..15] == 0 ]
我想了解如何在這種特殊情況下使用 all 。
我已經閱讀了 Haskell 檔案,但我對這種來自 Python 的語言不熟悉,所以我無法弄清楚邏輯。
uj5u.com熱心網友回復:
首先你可以有一個函式來檢查一個數字是否被所有 [2..15] 修改。
modByNumbers x ns = all (\n -> x `mod` n == 0) ns
然后你可以像mod函式一樣使用它:
take 10 [x | x <- [1..] , x `modByNumbers` [2..15] ]
uj5u.com熱心網友回復:
或者,使用數學,我們知道可以被所有小于的數整除的最小數是所有小于的n素數的乘積,將結果提升到 的底。xnlogBase x n
一個基本isPrime功能:
isPrime n = length [ x | x <- [2..n], n `mod` x == 0] == 1
使用它來獲得所有小于 的素數15:
p = [fromIntegral x :: Float | x <- [2..15], isPrime x]
-- [2.0,3.0,5.0,7.0,11.0,13.0]
現在我們可以得到指數:
e = [fromIntegral (floor $ logBase x 15) :: Float | x <- p']
-- [3.0,2.0,1.0,1.0,1.0,1.0]
如果我們將它們壓縮在一起。
z = zipWith (**) p e
-- [8.0,9.0,5.0,7.0,11.0,13.0]
然后找到這些的乘積,我們得到能被 2 到 15 之間的所有數字整除的最小數字。
smallest = product z
-- 360360.0
現在要得到其余部分,我們只需將其乘以 1 到 15 的數字即可。
map round $ take 10 [smallest * x | x <- [1..15]]
-- [360360,720720,1081080,1441440,1801800,2162160,2522520,2882880,3243240,3603600]
這具有運行速度大大加快的優勢。
uj5u.com熱心網友回復:
分解問題。
- 你已經知道如何獲取串列的前 10 個元素,所以把它放在一邊,忘記它。有無數個數可以被所有 [2,15] 整除,剩下的任務就是將它們全部列出。
- 自然數有無限多(無約束),并且您已經知道如何將它們全部
[1..]列出( . - 您已經知道如何將串列轉換為滿足某些約束 ( ) 的“子串列”
predicate :: X -> Bool。您在發布的代碼中使用了串列理解,但我認為如果您改用它,其余部分會更容易filter。無論哪種方式,您剩下的任務是將“可被所有 [2,15] 整除”表示為謂詞。. - 您已經知道如何檢查一個數字
x是否可以被另一個數字整除y。現在有一些新的東西:您想將其抽象為 上的謂詞x,并且您想將該謂詞引數化為y。如果被問到,我相信您可以自己獲得這部分:
divisibleBy :: Int -> (Int -> Bool)
divisibleBy y x = 0 == (x `mod` y)
您已經知道如何將 [2,15] 表示為[2..15]; 我們可以使用. 將其轉換為謂詞串列fmap divisibleBy。(或者map,明天擔心這種差異。)您剩下的任務是將謂詞串列轉換為謂詞。 - 你有幾個選擇,但你已經找到了
all :: (a -> Bool) -> [a] -> Bool,所以我會建議all ($ x)。(注)
一旦你把所有這些部分組合成一個可行的東西,你就可以把它歸結為看起來有點像你第一次寫的東西。
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/530203.html
標籤:哈斯克尔
上一篇:Haskell(Aeson):過濾特定元素問題的慣用方式
下一篇:Haskell——用空格填充串列
