簡體   English   中英

Haskell作業-小數列表[Int]-> Int

[英]Haskell Homework - Decimal List [Int] -> Int

分配是定義函數decimal :: [Int] -> Int ,其中一個正整數列表將給出十進制數 Sigma功能 因此這個列表[1,4,3,1,9]是返回Integer 14319.我使用fold功能。

我真的沒有從這里開始的好主意,所以我只需要朝着正確的方向推進,但我正在考慮霍納計划。 謝謝!

在折疊中,您從左側開始向右移動。 消耗列表中的下一個元素時,將您已有的元素乘以10,然后將新元素添加到該元素中。

因此,如果將折疊的種子設為0,並且具有[1,2,3],則函數會將電流(0)乘以10(也是0),然后加1。繼續,將電流(1)乘以10(得出得到10)並加2(12)。 然后最后為3,12 * 10 = 120,120 + 3 = 123。

那應該很容易編寫代碼:)

也許這個方程式將指導您。

S_n = \\ sum_ {k = 0} ^ n x_k 10 ^ {nk} = \\ sum_ {k = 0} ^ {n-1} x_k 10 ^ {nk} + x_n = 10 \\ sum_ {k = 0} ^ { n-1} x_k 10 ^ {((n-1)-k} + x_n = 10S_ {n-1} + x_n

由於這是一項家庭作業,因此我們不建議您將此表達式擴展為某些列表,並嘗試提取一個經常性關系:

x_0 * 10 ^ n + x_1 * 10 ^(n-1)+ ... + x_n * 10 ^ 0 =((((x_0 * 10 + x_1)* 10 + x_2)...)* 10 + x_n

如果將它與折疊比較,對於兩個參數的特定函數,將看到一個與該模式匹配的折疊。

這是我的變體

import Data.List
decimal :: [Int] -> Int
decimal xs = foldl' (\sum (pos,x) -> (sum + x*(10^(l-pos)))) 0 $ zip [1..] xs where
            l = length xs


*Main> decimal [1,4,3,1,9]
14319

Haskell ,您擁有真正強大的武器-列表處理功能。 這些功能之一是foldl (我們用嚴格的版本foldlfoldl' )它的類型

foldl :: (a -> b -> a) -> a -> [b] -> a

該函數接受三個參數,一個累加的累積量,一個已處理的列表,以及最感興趣的是對累加器和list元素執行任何操作並返回結果的函數。 折疊功能確實很重要,因此您應該閱讀有關它的詳細手冊
但是,有一個問題,我們的方程式有三個變量:已處理列表元素( x ),總列表長度( n )和已處理元素的位置( k )。 但是我們只能遍歷foldl元素。 我們如何遍歷每個元素的位置? 讓我們從Int組成元組,其中第一個元素是位置,第二個是值。 這是一個標准技巧, zip功能可幫助我們:

zip [1..] [1,4,3,4,6]
[(1,1),(2,4),(3,3),(4,4),(5,6)]

然后我們將元組列表傳遞給foldl函數,然后foldl為列表的每個元素調用lambda function (\\sum (pos,x) -> (sum + x*(10^(l-pos)))) ,將結果相加sum

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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