파이썬을 사용하여 내가하고 싶은 것을 설명해 드리겠습니다. (하스켈에서 이것을 작성하고 싶습니다.) 기본적으로, N = 1을 포함하는 D에서 반복 및 D 배의 값을 N/(D)의 바닥을 합산한다재귀 Haskell 함수로 이것을 작성하는 방법은 무엇입니까?
def f(n):
s=0
for d in range(1,n+1):
s+=d*(n//d)
return(s)
:이 기능을 갖는다.
내가 재귀가 필요하다고 생각하는 하스켈에서 이것을하고 싶습니다. 파이썬 상당 :
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 = 합계 $ 것이다 작성하는 관용적 인 방법을 (: 당신이 합계에서 그것을 끌어와 한 번만 번식 할 수 있도록 첫 번째
n
용어는d
에 의존하지 않는다 \ d -> d * (n'''d)) <$> [1..n + 1]'''. 더 효율적이기 때문에'div' 대신'quot'를 사용합니다. 'd'는 결코 음수가되지 않으므로 똑같이 행동 할 것입니다. 또한'readSthLn _ :: IO()'때문에'read <$> getLine' ('main'의 처음 두 줄)은'readLn'으로 더 잘 쓰여졌고'return()'은 필요 없습니다. – HTNW비싸지 않게'd * (n // d) == n - n % d'. – chepner