其他人可以在 Haskell 中撰寫此代碼嗎:加倍數字數字需要加倍,為此可以定義以下函式:
doubleDigits :: [Integer] -> [Integer]
該函式doubleDigits必須從右邊開始每隔一個數字加倍。倒數第二個數字首先加倍,然后是倒數第四個,...,依此類推。
Input: doubleDigits [1,2,3,4,5,6,7]
Output: [1,4,3,8,5,12,7]
toDigitsReverse :: Integer -> [Integer]
toDigitsReverse n = reverse (toDigits n)
-- function to help double every other element of list
doubleDigitsHelper :: [Integer] -> Integer -> [Integer]
doubleDigitsHelper l t
| l == [] = []
| t == 0 = [head l] (doubleDigitsHelper (drop 1 l) 1)
| t == 1 = [2*(head l)] (doubleDigitsHelper (drop 1 l) 0)
-- function to double every other element
doubleDigits :: [Integer] -> [Integer]
doubleDigits l = reverse (doubleDigitsHelper (reverse l) 0)
uj5u.com熱心網友回復:
另一種方法:
讓我們zip列出串列中的元素及其索引。
[1,2,3,4,5,6,7] `zip` [0..]
我們得到:
[(1,0),(2,1),(3,2),(4,3),(5,4),(6,5),(7,6)]
然后我們可以map這樣得到想要的結果:
let f (x, i) = if even i then x else x * 2 in map f $ [1,2,3,4,5,6,7] `zip` [0..]
結果是:
[1,4,3,8,5,12,7]
或者寫得有點不同:
doubleDigits lst = map f lst'
where
lst' = lst `zip` [0..]
f (x, i)
| even i = x
| otherwise = x * 2
因為您想從right開始將所有其他元素加倍,您可以簡單地反轉串列,用索引壓縮它,映射,然后保留輸出。
doubleDigits lst = reverse $ map f lst'
where
lst' = (reverse lst) `zip` [0..]
f (x, i)
| even i = x
| otherwise = x * 2
uj5u.com熱心網友回復:
我會說首先沒有必要reverse列出,確定累加器(t)是偶數還是奇數(例如,有內置函式even),然后采取相應的行動。接下來可以改進代碼的方法 - 使用模式匹配而不是==和head/tail呼叫。我還更改了輔助函式的順序:
-- function to help double every other element of list
doubleDigitsHelper :: Integer -> [Integer] -> [Integer]
doubleDigitsHelper _ [] = []
doubleDigitsHelper t (x:xs) | even t = x : doubleDigitsHelper (t 1) xs
| otherwise = 2*x : doubleDigitsHelper (t 1) xs
-- function to double every other element
doubleDigits :: [Integer] -> [Integer]
doubleDigits = doubleDigitsHelper 0
uj5u.com熱心網友回復:
您可以將要應用的交替函式放在一個串列 ( cycle [id, (*2)]) 中,然后使用 將它們應用到您的串列中zipWith。
doubleDigits :: Num a => [a] -> [a]
doubleDigits = reverse . zipWith ($) (cycle [id, (*2)]) . reverse
如果您想從右側開始交替,我看不到反轉串列的優雅方法。例如,您可以先查看串列的長度,然后根據該長度更改函式的順序,但這會使函式稍微復雜化。
doubleDigits xs = zipWith ($) fs xs
where fs = (if even . length $ xs then tail else id) $ cycle [id, (*2)]
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/498434.html
標籤:哈斯克尔
