2015-01-06 3 views
-1

Я пытаюсь преобразовать Python в Haskell, но сталкиваюсь с трудностями. Я очень новичок в Haskell и знаю только основы. Вот код Python, который мне нужен в Haskell. Кто-нибудь может мне помочь?Продукт факториала in haskell

Спасибо.

import sys 
fact=[] 
def facto(): 
    mod=1000000007 
    f1=1;f2=1 
    for j in xrange(1,1000001): 
     f1=f1*j%mod 
     f2=f2*f1%mod 
     fact.append(f2) 
def main(): 
    facto() 
    tc=int(sys.stdin.readline()) 
    for i in xrange(tc): 
     n=int(sys.stdin.readline()) 
     sys.stdout.write("Case %d: "%(i+1)) 
     print fact[n-1] 
main() 
+3

Можете ли вы показать нам, что вы пробовали в Haskell? Более конкретно о том, где у вас возникают проблемы, какие ошибки вы получаете и т. Д. –

+0

Я искал googled и нашел учебник по haskell, где какая-то встроенная функция была mntion factorial 'n = product [1..n]' mod' 1000000007', но это занимает больше времени. Вот почему я попросил здесь о помощи. – Lakshman

+0

@JustinWood Я googled и нашел учебник haskell, где некоторая встроенная функция была metion factorial 'n = product [1..n] mod 1000000007', но это занимает больше времени. Вот почему я попросил здесь о помощи. – Lakshman

ответ

3

Вот способ создания "продукт факториалов" списка с помощью scanl:

p = 1000000007 :: Int64 
mtimes a b = mod (a * b) p 
facts = scanl mtimes 1 [1..] 
prodfacts = scanl mtimes 1 facts 

Примечание:

ghci> take 10 facts 
[1,1,2,6,24,120,720,5040,40320,362880] 

ghci> take 10 prodfacts 
[1,1,1,2,12,288,34560,24883200,411327125,709563912] 
+1

Я бы стал более явным: 'p = 1000000007 :: Int64', поскольку на 32-битной платформе вы получите неправильные результаты из-за переполнения целого числа. – user3237465

+0

Хороший вопрос - я обновлю ответ. – ErikR

+0

Тип по умолчанию для чисел в Haskell является 'Integer', поэтому добавление' :: Int64' вызывает переполнение, а не предотвращает их. –