Nasser
Nasser

Reputation: 29

SumFromTo , A Recursive Function

I am trying to do a recursive function that should give the sum of all integers between and including its two arguments. For example, sumFromTo 5 8 is 5 + 6 + 7 + 8 = 26. If the first argument is greater than the second, the function should return 0.

This is what I got currently but I am a beginner and I don't think I did it right

sumFromTo :: Int -> Int -> Int
sumFromTo x y 
| x == 1 = 1 
| y == 1 = 1 
| x > 1 && y > 1 = x + y sumFromTo (x - 1)
| otherwise = 0 

Any help please?

Upvotes: 0

Views: 251

Answers (2)

willeM_ Van Onsem
willeM_ Van Onsem

Reputation: 477240

I think you make the problem too complex if you want to implement this with recursion. Basically there are two cases:

  1. one where the lower bound is greater than the upper bound, in which case the sum is zero; and
  2. one where the lower bound is less than or equal to the upper bound.

The first case (1) can be expressed by writing:

sumFromTo x y | x > y = 0

In the second case, the result is the lower bound plus the sum of the lowerbound plus one to the upper bound, so:

              | otherwise = x + sumFromTo (x+1) y

and putting these together:

sumFromTo :: (Num a, Ord a) => a -> a -> a
sumFromTo x y | x > y = 0
              | otherwise = x + sumFromTo (x+1) y

Upvotes: 1

Zpalmtree
Zpalmtree

Reputation: 1369

You can use a list comprehension to do this very simply:

sumFromTo :: Int -> Int -> Int
sumFromTo x y = sum [x..y]

However, I'm not sure what you'd want to do if x == y.

In the code you've given, your recursive definition isn't correct syntax. You've only given sumFromTo one argument, when it needs two, and you appear to have missed a + between the y and the function.

λ> sumFromTo 8 5
0
λ> sumFromTo 5 8
26
λ> sumFromTo 8 8
8
λ> 

[a..b] means a list with a step of 1 between a and b, so [1..4] is [1,2,3,4]

Thanks to Phylogenesis, here is a recursive definition:

sumFromTo :: Int -> Int -> Int
sumFromTo x y
    | x > y = 0
    | x == y = x
    | otherwise = x + sumFromTo (x + 1) y

Upvotes: 2

Related Questions