[英]Euclid's algorithm using until
我是Haskell的初學者,現在才開始學習褶皺,而在大學一年級的時候就開始學習褶皺。
我現在面臨的問題之一是使用until
函數定義Euclid的算法。
這是Euclid的遞歸定義(編輯:只是為了展示euclid的工作方式,我試圖在不遞歸的情況下定義euclid。僅使用直到):
gcd a b = if b == 0 then a else gcd b (a `mod` b)
這是我一直使用的直到:
gcd a b = until (==0) (mod a ) b
顯然,這沒有任何意義,因為它總是要返回0
,因為這是我的出發點,而不是當b == 0
時打印a的值。 我不能為我的生活雖然弄清楚如何獲得價值a
。
任何幫助表示贊賞。 預先謝謝你們。
現在
until :: (a -> Bool) -> (a -> a) -> a -> a
所以我們需要一個可以重復應用直到條件成立的函數,但是我們有兩個數字a
和b
,那我們該怎么做呢?
解決方案是將兩個數字合為一個值(a,b)
,這樣想想gcd
:
uncurriedGCD (a,b) = if b == 0 then (a,a) else uncurriedGCD (b,a `mod` b)
現在您可以創建兩個功能, next
和check
, until
使用它們。
until
: next (a,b) = (b,a `mod` b)
check (a,b) = b == 0
這意味着我們現在可以使用until
來編寫uncurriedGCD
。
例如:
ghci> until check next (6,4)
(2,0)
ghci> until check next (12,18)
(6,0)
因此我們可以定義:
gcd a b = c where (c,_) = until check next (a,b)
給予:
ghci> gcd 20 44
4
ghci> gcd 60 108
12
Euclid的算法是這樣說的:對於(a, b)
,計算(b, mod ab)
直到(新的) b
等於零。 這可直接轉換到使用實現until
這樣的:
myGcd a b = until (\(x, y) -> y == 0) (\(x, y) -> (y, x `mod` y)) (a, b)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.