Saya menabrak dinding ketika saya mencoba menghitung% pertumbuhan dari daftar bilangan bulat ke daftar pelampung. Saya baru mengenal Haskell dengan sedikit pengalaman dan tidak yakin di mana atau apa untuk mencari masalah saya, jadi saya datang ke sini. :)

function :: [Ints] -> [Floats]

Saya punya daftar.

nums = [4561,3241,2345,3455,4567]

Saya perlu mengulangi daftar dan menghitung % persentase pertumbuhan dari nums[4] ke nums[0] dan kemudian menampilkan daftar float. Tetapi saya tidak yakin apakah akan menggunakan fungsi peta atau metode lain untuk menyelesaikan ini. Saya perlu beberapa cara untuk mengambil dua angka dari daftar yaitu nums[4] dan nums[3] dan menghitung % pertumbuhan.

-2
abzNHP 12 Mei 2021, 19:09

1 menjawab

Jawaban Terbaik

Saya tidak yakin apa yang Anda butuhkan tetapi jika itu adalah pertumbuhan dari elemen ke (n-1)ke nAnda dapat melakukannya seperti ini:

growth :: [Int] -> [Float]
growths xs = 
    zipWith (\n n' -> fromIntegral (n'-n) / fromIntegral n * 100) xs (tail xs)

Menghasilkan

> growths [4561,3241,2345,3455,4567]
[-28.941021,-27.645788,47.334755,32.185238]

-- this one makes it a bit more obvious what is happening
> growths [1,2,3,4,5]
[100.0,50.0,33.333336,25.0]

Saya mungkin salah rumus dan Anda ingin beberapa rumus lain tetapi idenya harus jelas selama Anda ingin membandingkan angka berurutan.


trik zipWith f xs (tail xs) sering kali berguna untuk bekerja dengan elemen berurutan dalam daftar. Di sini argumen pertama untuk f adalah (n-1)th dan yang kedua adalah elemen nth dalam daftar.


Jika Anda perlu dari n ke n-1th (seperti yang tampaknya Anda maksudkan) cukup balikkan argumennya:

growths xs = 
    zipWith (\n' n -> fromIntegral (n'-n) / fromIntegral n * 100) xs (tail xs)

> growths [4561,3241,2345,3455,4567]
[40.72817,38.208954,-32.12735,-24.348589]


> growths [1,2,3,4,5]
[-50.0,-33.333336,-25.0,-20.0]
1
Carsten 12 Mei 2021, 17:18