Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Implementing recursion in Haskell without input variable

So im still very new to programming and I'm struggling a lot with the Syntax of Haskell. I kind of know what I want to implement but im not really sure how to do it so I came here to ask.

So what I have is a "pile" of Numbers in no particular order that are defined by 3 different functions. An example for this would be:

lowestnumber = 4
highestnumber 5 = True
highestnumber _ = False
above 4 = 11
above 11 = 18
above 18 = 2
above 2  = 3
above 3  = 5
above 5  = error "highest Number"
above _ = error "Not part of the pile"

Now for one I want to write a function that checks if a certain number is part of this pile and a different function "sum' = " that sums up all the elements of the list without an input variable. First I solved these problems by defining a list and using listcommands in order to sum up and see if something is "elem" of that list but I am supposed to solve it without using lists.

So I have ideas of how to solve this but I have no idea of how to actually write it without receiving countless errors. Some examples of what I've tried for the check function:

check x = if above x /= error "Not part of the stack" || lowestnumber == x then True else False

I also tried the checks with "_" like this but it wouldn't work either:

check x if above x == _ || lowestnumber == x then True else False

My idea for the sum function was this:

sum' = lowestnumber + above lowestnumber + above (above lowestnumber) + above (above (above lowestnumber))

or also something like

sum' = lowestnumber + (above sum') 

Which I understand woul

and so on but I did not figure out how I could implement this using recursion which is apparently the way to go.

Well hopefully this question isnt too stupid! I hope you can help me :)

Edit: Ok, so these are the solutions to my 3 function-problems

sumup' a b 
           |highestNumber a == True = a+b 
           |otherwise = sumup' (above a) (a+b)

sumup = sumup' lowestNumber 0



check' a b 
            |a == b = True
            |True == highestNumber a && a==b = True
            |True == highestNumber a && a/=b = False
            |check' (above a) (b) == True = True
            |otherwise = False

check b = check' (lowestNumber) (b)



above' :: Integer -> Integer -> Bool
above' x y
            | check x == False = False
            | check y == False = False
            | highestNumber y == True = False
            | highestNumber x == True = True
            | x==y = True
            | above' x (above y) == True = True
            | otherwise = False
like image 749
user2299050 Avatar asked Dec 01 '22 03:12

user2299050


1 Answers

If you want to do this without lists, keep a running total, and use recursion.

If you're at the highestnumber, just add that to your current total and stop, otherwise, add the number to your total total + n and move on to the next one above n:

add n total |highestnumber n = total + n
            |otherwise = add (above n) (total + n)

Then you can do

answer = add lowestnumber 0
like image 108
AndrewC Avatar answered Dec 05 '22 06:12

AndrewC