Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How can I return list with different values?

If I have the following list:

(define thelist '(0 1 0 0 7 7 7))

How can I write a function that returns a new list in which the value in the requested cell is replaced.

Example:

(set-cell thelist 2 4)

This would return a new list with the same values, but in cell (2) there will be the value 4 instead of 1:

(0 4 0 0 7 7 7)
like image 427
jacky brown Avatar asked Feb 22 '23 23:02

jacky brown


2 Answers

HtDP provides a really concrete methodology for solving this kind of problem. For this problem, your job is going to be to write down the template for lists, then to stare at it until you can see what the arguments to the recursive call should be, and what the results will be. I'm hoping that you've solved a bunch of warm-up problems on lists--compute the length of a list, count the number of 6's in the list, etc.

like image 60
John Clements Avatar answered Feb 28 '23 04:02

John Clements


Although you can implement the requested functionality with lists, the natural way to solve that problem is to use a vector, and remember that in Scheme indexes start in 0 (that's why the second argument for vector-set! is a 1 and not a 2):

(define thevector (vector 0 1 0 0 7 7 7))
; thevector is #(0 1 0 0 7 7 7)
(vector-set! thevector 1 4)
; thevector is #(0 4 0 0 7 7 7)

Now, if you definitely need to use a list, something like this would work:

(define (set-cell lst idx val)
  (cond ((null? lst) '())
        ((zero? idx) (cons val (cdr lst)))
        (else (cons (car lst)
                    (set-cell (cdr lst) (sub1 idx) val)))))

And you'd call it like this:

(define thelist '(0 1 0 0 7 7 7))
(set-cell thelist 1 4)
> (0 4 0 0 7 7 7)

Again, I'm using 0-based indexing, as is the convention. Also notice that thelist was not modified, instead, set-cell returns a new list with the modification.

like image 33
Óscar López Avatar answered Feb 28 '23 02:02

Óscar López