1 / 20

Exercises – don’t use built in functions for these as we want the practice

Exercises – don’t use built in functions for these as we want the practice. Write a recursive function to add up all the numbers in a list "flatten" a list of lists into a list – concat [[1,2], [], [3], [4,5]] = [1,2,3,4,5] . sum' [] = 0 sum' (x:xs) = x+ sum' xs flatten' [] = []

nuncio
Download Presentation

Exercises – don’t use built in functions for these as we want the practice

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Exercises – don’t use built in functions for these as we want the practice • Write a recursive function to add up all the numbers in a list • "flatten" a list of lists into a list – concat [[1,2], [], [3], [4,5]] = [1,2,3,4,5]

  2. sum' [] = 0 sum' (x:xs) = x+ sum' xs flatten' [] = [] flatten' (x:xs) = x++ flatten' xs

  3. More Exercises – don’t use built in functions • return the first element in a list, giving an error if the list is empty e.g., head "string" = 's' • take two lists and make a list of pairs -- e.g., zip [1,2] [3,4,5] = [(1,3),(2,4)]

  4. head' [] = error "no head" head' (x:xs) = x zip' [] x = [] zip' x [] = [] zip' (x:xs) (y:ys) = [(x,y)] ++ (zip' xsys) or zip’ (x:xs) (y:ys) = (x,y) : (zip1 xsys)

  5. Use list comprehensions to do these • For a list of tuples, add each pair in a list addPairs :: [(Integer,Integer)] -> [Integer] [(2,3), (4,0), (5,5)] yields [5,4,10] • Write a function to select only the items in a list which are bigger than 10 • List all pairs of numbers from [1,3,5] X [2,4,6] in which the second component is bigger

  6. addPairs list = [x+y| (x,y)<-list] • select x = [a| a <- x, a > 10] filter (>10) list (using the built-in function) • bigger x y = [(a,b)|a<- x, b<- y, a < b]

  7. Write a function delete to remove an element from a list delete 4 [1,3,4,6] yields [1,3,6] delete 5 [1,3,4,6] yields [1,3,4,6] • Write a function to remove all items from the first list that are also in the second list diff [1,3,4,5,7] [3,9] yields [1,4,5,7]

  8. remove y [] = [] remove y (x:xs) = if y==x then remove y xs else x:(remove y xs) or remove x list = [y|y <-list, y/=x] setDif z [] = z setDifxs (y:ys) = setDif (remove y xs) ys

  9. Using list comprehensions • Create a list which multiplies all combinations of elements of the two lists together mult [1,2,3,4] [3,5,7,9] yields [3,5,7,9,6,10,14,18,9,15,21,27,12,20,28,36] Create a listwhichtellswhethereachitemisoddoreven oddEle [1..9] yields[True,False,True,False,True,False,True,False,True]

  10. multxsys = [a*b | a<- xs, b<- ys] oddEle xs = [odd x| x<- xs]

  11. Factors • Find the factors of a number less than itself factors 24 yields [1,2,3,4,6,8,12]

  12. factors x = [n|n<-[1..(x `div` 2)], x `mod` n ==0]

  13. Generate all possible permutations of a list perms [1,2,3] yields [[1,2,3], [1,3,2], [2,1,3], [2,3,1], [3,1,2],[3,2,1]] Note: If you have two generators it treats them as nested: [(i,j) | i <- [1,2], j <- [10..14]] yields the result [(1,10), (1,11), (1,12),(1,13),(1,14),(2,10),(2,11), (2,12),(2,13),(2,14)]

  14. remove y [] = [] remove y (x:xs) = if y==x then remove y xs else x:(remove y xs) perms [] = [[]] perms xs = [(x:y) | x <- xs, y <- perms (remove x xs)]

  15. Quicksort • Pick an element, called a pivot, from the list. • Reorder the list so that all elements with values less than the pivot come before the pivot, while all elements with values greater than the pivot come after it (equal values can go either way). After this partitioning, the pivot is in its final position. This is called the partition operation. • Recursively sort the sub-list of lesser elements and the sub-list of greater elements.

  16. qsort :: [Int]  [Int] qsort [] = [] qsort (x:xs) = qsort smaller ++ [x] ++ qsort larger where smaller = [a | a xs, a  x] larger = [b | b xs, b  x]

  17. User defined types data Student = USU String  Float Suppose you have a list of students (using the above type definition), create a list of students with a GPA > 3.0 Note: String is the same as [Char] What is the TYPE of your function?

  18. data Student = USU String Float myclass = [USU "Mike" 3.7, USU "Steve" 3.9, USU "Fred" 2.9, USU "Joe" 1.5] selectBest :: [Student] -> [String] selectBest [] = [] selectBest ((USU name gpa):list) = name : selectBest list

  19. Write a linked list insertion data List = Nil | Node Int List deriving (Show) Do a regular linked list insertion. Try an ordered linked list insertion.

  20. data List = Nil | Node Int List deriving (Show) myList :: List -- constant function myList = (Node 5 (Node 13 (Node 20 Nil))) addList x rest = (Node x rest) addOrdered x Nil = Node x Nil addOrdered x (Node y rest) = if x < y then (Node x (Node y rest)) else Node y (addOrdered x rest)

More Related