Использование аккумулятора для суммирования чисел в F # - PullRequest
1 голос
/ 13 апреля 2019

Я пытаюсь решить проблему, которая требует, чтобы я суммировал 2 числа, но я должен использовать аккумулятор в своей функции.Вот математическая формула:

sum(m, n) = m + (m + 1) + (m + 2) + · · · + (m + (n − 1)) + (m + n)

Вот что у меня есть:

let rec g (m, n) = 
    let rec gAcc m n a = 
        match n with
        | 0 -> a + m
        | n -> gAcc m (n-1) (a+n+m)
    let result = gAcc n m 0   
    result // returned by g 

Примером будет g(1,2), должно возвращаться 5. Я не уверен, что яя на правильном пути здесь?Есть идеи?

1 Ответ

3 голосов
/ 13 апреля 2019

Вы поменяли местами аргументы m и n при первоначальном вызове gAcc.

gAcc n m 0

должно быть

gAcc m n 0

Это одна из причин, по которой короткие ипохожие имена переменных, такие как m и n, не очень хорошая идея.

Вам также не требуется привязка result, вы можете использовать простое выражение if вместо match, и обрабатывать n = 0 так же, как n > 0, так как m + 0 = m:

let rec g (m, n) = 
    let rec gAcc m i a = 
        if i >= 0 then
            gAcc m (i-1) (a+i+m)
        else
            a
    gAcc m n 0
...