簡體   English   中英

Euclid算法使用直到

[英]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

所以我們需要一個可以重復應用直到條件成立的函數,但是我們有兩個數字ab ,那我們該怎么做呢?

解決方案是將兩個數字合為一個值(a,b) ,這樣想想gcd

uncurriedGCD (a,b) = if b == 0 then (a,a) else uncurriedGCD (b,a `mod` b) 

現在您可以創建兩個功能, nextcheckuntil使用它們。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM