1

割り当ては、正の intのリストが 14319 を返すようdecimal :: [Int] -> Intに 10 進数を与える関数を定義することです。私はその関数を使用します。シグマ関数[1,4,3,1,9]Integerfold

ここから始めるのは本当に良いアイデアがないので、正しい方向にプッシュする必要があるだけですが、ホーナーのスキームについて考えていました。ありがとう!

4

4 に答える 4

-3

これは私の変種です

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には、非常に強力な武器、つまりリスト処理用の機能があります。これらの関数の 1 つはfoldl(厳密なバージョンのfoldl,を使用しますfoldl') 型です

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

この関数は、3 つの引数、累積引数、処理されたリスト、および最も重要な、アキュムレータとリスト要素を使用して任意の操作を実行し、結果を返す関数を受け取ります。Fold は非常に重要な機能なので、詳細なマニュアルを読む必要があります。
しかし、問題があります。式には 3 つの変数があります。処理されたリスト要素 ( x)、リストの合計の長さ ( n)、処理された要素の位置 ( k) です。しかし、トラバースできるfoldl要素は 1 つだけです。各要素の位置をどのようにトラバースできますか? Int最初の要素が位置で、2 番目の要素が値のタプルを形成しましょう。これは標準的なトリックです。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

于 2013-09-27T11:28:54.097 に答える