我想創建一個標題中提到的函式。具體是它以相反的順序添加數字,您可以在測驗用例中看到:12 -> 1; 852369 -> 628; 1714 -> 11;12345 -> 42;891 -> 9; 448575 -> 784;4214 -> 14
主要思想是,當數字大于 99 時,它進入輔助函式,該函式具有 i - 指示該數字是否位于偶數位置,以及存盤結果的 res。助手開始回圈 n,因為它檢查當前數字是否在偶數位置并將其添加到結果中。
到目前為止,我已經嘗試了以下代碼:
everyOther :: Int -> Int
everyOther n
| n < 10 = error "n must be bigger than 10 or equal"
| n < 100 = div n 10
| otherwise = helper n 0 0
where
helper :: Int -> Int -> Int -> Int
helper n i res
| n < 100 = res
| i == 1 = helper (div n 10) (i - 1) (res (mod n 10)*10)
| otherwise = helper (div n 10) i res
任何幫助,將不勝感激!
uj5u.com熱心網友回復:
您可以獲得xwith的最后一位mod (div x 10) 10。您可以將其與累加器一起使用,該累加器通過每次乘以?? 10 來累加值,因此:
everyOther :: Int -> Int
everyOther = go 0
where go a v
| v < 10 = a
| otherwise = go (10*a mod (div v 10) 10) (div v 100)
如果v因此小于 10,我們可以回傳累加器,因為不再有“其他數字”。如果不是這種情況,我們將 乘以a,10并添加mod (div v 10) 10以將另一個數字添加到其中,并使用除以 100 的值進行遞回以將其向右移動兩位。
正如@Daniel Wagner 所說,我們可以通過使用quotRem :: Integral a => a -> a -> (a, a):
everyOther :: Int -> Int
everyOther = go 0
where go a v
| v < 10 = a
| otherwise = let (q, r) = v `quotRem` 100 in go (10*a r `quot` 10) q
因此,我們在這里使用除以 100 的余數,從而避免了額外的模數。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/440922.html
標籤:哈斯克尔
上一篇:Ejs不呈現ejs檔案
