diff options
author | Julian T <julian@jtle.dk> | 2021-09-08 12:34:43 +0200 |
---|---|---|
committer | Julian T <julian@jtle.dk> | 2021-09-08 12:35:37 +0200 |
commit | c03ad645b32d191dd5aa8c2f492f8067f351d137 (patch) | |
tree | 428a9f3fd722ca29aceecd4dea4478305a17a56a | |
parent | 9e828fa04231d2d01c5c7701375484a3beea79ed (diff) |
Add some exercises for scheme course
-rw-r--r-- | sem7/pp/lec1/exercises.sch | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/sem7/pp/lec1/exercises.sch b/sem7/pp/lec1/exercises.sch new file mode 100644 index 0000000..9be35e2 --- /dev/null +++ b/sem7/pp/lec1/exercises.sch @@ -0,0 +1,36 @@ +(define (make-list-ft from to) + (if (> from to) + '() + (cons from (make-list-ft (1+ from) to)))) + +;; Exercise 1.3 (proper lists) +;;? Program own version of list?, thus proper-list? +;; This is done by running to the end of list, always checking if pair. +;; If last element is '() its a proper list, otherwize its not. +(define (proper-list? list) + (if (pair? list) + (proper-list? (cdr list)) + (null? list))) + +;;? Can you write your predicate without using if or cond? +;; Hmm i cant see how this would be done, as we are using recursion which requires a stop condition. + +;;? Is your function efficient? What is the time complexity? +;; This runs over all the elements in the list, so O(n). +;; Hmm reading through the solution, i see that we can use other conditional functions like `or` and `and`. +;; Lets try that +(define (proper-list? list) + (or (null? list) (and (pair? list) (proper-list? (cdr list))))) + +;; Okay thats just his solution + +;; Exercise 1.5 (every second element) +;; Hmm the text mentions that we could write it with (every-nth-element) +(define (every-nth-element n list) + (let recur ((list list) (index 0)) + (cond ((null? list) '()) + ((zero? (modulo index n)) (cons (car list) (recur (cdr list) (1+ index)))) + (else (recur (cdr list) (1+ index)))))) + +(define (every-2th-element list) + (every-nth-element 2 list)) |