私はPythonを使って何をしたいのかを説明します(私はHaskellでこれを書いています)。私はこの機能を持っています。基本的に包括nにD = 1からループし、そしてd n倍/ Dの床の値を合計されこれを再帰的なHaskell関数として書くには?
def f(n):
s=0
for d in range(1,n+1):
s+=d*(n//d)
return(s)
。
私は再帰が必要だと考えているハスケルでこれをしたいと思っています。 Pythonの同等:
def f(d, n):
if d == 0: return 0
else: return d*(n//d) + f(d-1, n)
そして、私はf(n, n)
で関数を呼び出します。
これを書き込む正しい方法は何ですか?
私の試み:
f (d n) = if d == 0 then 0 else d * (n//d) + f (d - 1 n)
編集、完全なコード:あなたが与えた
main = do
input_line <- getLine
let n = read input_line :: Int
f d n
| d == 0 = 0
| otherwise = d * (n `div` d) + f (d-1) n
putStrLn f n n
return()
参考のために、これを書くための慣用的な方法は、 '' 'FN =合計$(だろう\ d - > d *(n '' 'd))<$> [1..n + 1]' ''。私は 'div'の代わりに' quot'を使います。これはもっと効率的だからです。 'd'は決して負ではないので、同じ動作をします。また 'read <$> getLine'(別名' main'の最初の2行)は 'readLn'と書かれています。' putStrLn _ :: IO() 'のために' return() 'は必要ありません。 – HTNW
安価で、 'd *(n // d)== n - n%d'です。 – chepner