Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to return a list of numbers between 1 and x

Tags:

list

scheme

I'm trying to create a function that takes in user input, x, and displays all of the numbers from 1 up to x. Not quite sure where to go from here:

(define (iota x)
     (if (>= x 1)
        (display
like image 315
user2058186 Avatar asked Jan 23 '26 12:01

user2058186


2 Answers

;; Takes a number n
;; and returns a list with 1..n
;; in order.
(define (make-list n)
  (let loop ((n n) (accumulator '()))
    (if (zero? n)
        accumulator
        (loop (- n 1) (cons n accumulator)))))

;; prints data and adds
;; a newline
(define (println x)
  (display x)
  (newline))

;; prints 1..n by applying println 
;; for-each element over the list 1..n
(define (iota n)
  (for-each println (make-list n)))
like image 99
Sylwester Avatar answered Jan 25 '26 08:01

Sylwester


Basically you want to use recursion. So think of it was counting up. As you count up either you've added enough numbers and you are done building your list or you need to add the current number to your list and go on to the next number.

Look at the following code:

(define (range-2 next-num max-num cur-list)
        ;;if we've added enough numbers return               
        (if (> next-num max-num)
            cur-list
            ;; otherwise add the current number to the list and go onto the next one
            (range-2
                (+ 1 next-num)
                max-num
                (append cur-list (list next-num))
            )))

But to get the function you wanted you need to start off with the constants you specified (ie 1), so lets create a convenience function for calling range with the starter values you need to set up the recursion, sometimes called priming the recursion:

(define (range X)
    (range-2 1 X `() ))

You could do it without the second function using lambda, but this is pretty common style from what I've seen.

Once you've constructed a list of the numbers you need you just display it using

(display (range 10))
like image 25
Sled Avatar answered Jan 25 '26 09:01

Sled



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!