2015-01-16 12 views
5

Son görevime gelene kadar ödevlerim gayet iyi geçti.Özel 'katlama' işlevinin karşılanması gerekir.

foldList :: (a -> b -> b) -> b -> List a -> b 
foldList f b Nil  = b 
foldList f b (Cons a l) = f a (foldList f b l) 

ikinci parametre ucunda kullanılan değerdir:

data List a = Nil | Cons a (List a) deriving Show 

Başka bir görev, özel bir fold işlev yazmak için:
Birincisi, özel bir List yapısını tanımlamak zorunda listenin (bir Nil öğesinde).

prodList :: List Int -> Int 
prodList = foldList (\x y -> x * y) 1 

ucunda 1 multplication nötr elemandır:

Ayrıca birbirleri ile verilen listeden her eleman çarpar bir işlev prodList yazmak zorunda kaldı. Bu nedenle hesaplama üzerinde bir etkisi yoktur.

Sonuncusu, benim çözmem zor.
Bir ikili sayıyı temsil eden listenin ondalık değerini hesaplayan bir binList işlevini yazmam gerekiyor. En az anlamlı bit, listenin ilk öğesidir, bu nedenle ikili sayı tersine çevrilir.
Verilen bir örnek, binList (Cons 1 (Cons 0 (Cons 0 (Cons 0 (Cons 1 Nil))))) sonucunun 19 olması gerektiğidir (çünkü (10001) _2 (19) _10). Bununla birlikte, listenin sonucu [1,1,0,1], (1011) _2 = (11) _10) olmalıdır.
Ödevin suçu, 'un foldList'u kullanmasıdır.

Her rakamı hesaplamak için nasıl biliyorum ama ben şu anda olduğum hangi endeks i öğrenmek için bir yol bulmak için mücadele:

binList :: List Int -> Int 
binList = foldList (\x y -> 2^i*x + y) 

muhtemelen bu çözmek için güzel, köri yolu yoktur Haskell. Bu ödevi nasıl çözeceğinizi açıklayabilir misiniz? Eğer hesaplama yazmak için olsaydı

+3

: Böyle tür görünen bir öz benzerlik olduğuna dikkat edin. (İpucu: 10 haneye sahipseniz, en önemlileri 2, 9 çarpı ile çarpılmalıdır ... bu listede sağdaki basamak sayısıdır .. hmm ....) – alternative

+0

Fonksiyon uygulanır eleman bazında. Listenin öğelerinin her biri için 'i' değişiyor. Üssü belirlemek için endeksi bilmeden bunu nasıl yapabileceğimizi bilmiyorum. – J0hj0h

+0

o.O Bu kadar kolay! İpucu için teşekkürler! Tamamen bunu yapmanın yolu unutuldu! : D – J0hj0h

cevap

6

, bu şekilde görünecektir:

:

x0 + 2 * x1 + 4 * x2 + 8 * x3 + ... 

Bu indeks kullanmak gerekir, ancak bu ifadeyi çarpanlarına varsa, bu yerine almak önerebiliriz

x0 + 2 * (x1 + 2 * (x2 + 2 * (x3 ... 

Şimdi bir katlama olarak nasıl yazılabildiğini görüyor musunuz?

x + 2 * x' 

Umarım sizin için bir ipucu yeter :) Sen de ne indeksi bilmek gerekmez

+0

Evet, çok teşekkü[email protected] zaten bu ipucu verdi ve ben sadece kodu yazdım. Bu çalışıyor! Bazen ağaçların ağaçlarını görmüyorum. : D – J0hj0h

İlgili konular