--- tags: cs1101s --- # CS1101S Studio S5 (T08C) ## Data Abstractions ### Question 1 Draw box-and-pointer for the values of the following expressions. Also give box and list notation. ```javascript! list(list(1, 2, list(3)), list(4, 5), pair(6, 7)); ``` ```javascript! ``` ```javascript! pair(1, list(2, 3, pair(4, null))); ``` ```javascript! ``` ```javascript! pair(1, pair(2, list(3, list(4, 5)))); ``` ```javascript! ``` ### Question 2 Examine the following (incorrect) `reverse` function: ```javascript! function reverse(lst) { return is_null(lst) ? null : pair(reverse(tail(lst)), head(lst)); } ``` Draw the box-and-pointer diagram, box notation and list notation for the result returned by the following function call: ```javascript! reverse(list(1, 2, 3, 4)); ``` ```javascript! ``` ### Question 3 Write expressions using `lst`, `head` and `tail` that will return 1 when the `lst` is bound to the following values: ```javascript! list(7, list(6, 5, 4), 3, list(2, 1)); ``` ```javascript! ``` ```javascript! list(list(7), list(6, 5, 4), list(3, 2), 1); ``` ```javascript! ``` ```javascript! list(7, list(6), list(5, list(4)), list(3, list(2, list(1)))); ``` ```javascript! ``` ```javascript! list(7, list(list(6, 5), list(4), 3, 2), list(list(1))); ``` ```javascript! ``` ## Bonus Round ### Question 1 The function `list_ref` can be applied to a list `xs` and a number `n`, and returns the `n`-th element of the list, starting counting at 0. So `list_ref(list(1, 2, 3), 2)` evaluates to 3. The position of an element in the list is called its *rank*; we say that the number 3 has rank 2 in the list. Write a Source function called `every_second` that takes a list as its only argument and returns a list containing all the elements of odd rank (i.e. every second element) from the input list. ```javascript! function every_second(items) { return (is_null(items)) || (is_null(tail(items))) ? null : pair(head(tail(items)), every_second(tail(tail(items)))); } ``` ### Question 2 Write a Source ยง2 function called `sums` that takes a **list of numbers** as its only argument and returns a **list of numbers**, containing two elements: the first is the sum of all even-ranked numbers in the input list (ranks 0, 2, 4 etc), whereras the second element is the sum of all odd-ranked elements in the input list (ranks 1, 3, 5 etc). ```javascript! function sums(list_of_numbers) { const even_list = every_second(pair("empty", list_of_numbers)); const odd_list = every_second(list_of_numbers); return list(accumulate((x, y) => x + y, 0, even_list), accumulate((x, y) => x + y, 0, odd_list)); } function every_odd(items){ function every_2(n){ return n > length(items) - 1 ? null : pair(list_ref(items,n),every_2(n+2)); } return every_2(0); } function every_second(items){ function get_element(list, n){ return is_null(list) ? null : n % 2 === 1 ? pair(head(list), get_element(tail(list),n + 1)) : get_element(tail(list), n + 1); } return get_element(items, 0); } function sums(list){ const accum_even = accumulate((x,y) => x + y, 0 ,every_second(list)); const accum_odd = accumulate((x,y) => x + y, 0 ,every_odd(list)); return pair(accum_even,pair(accum_odd,null)); } ```