如何返回1到x之间的数字列表

时间:2014-03-18 13:31:49

标签: list scheme

我正在尝试创建一个接受用户输入x的函数,并显示从1到x的所有数字。不太清楚从哪里开始:

(define (iota x)
     (if (>= x 1)
        (display

5 个答案:

答案 0 :(得分:2)

如果您使用的是Racket,那么您可以使用iterations and comprehensions,例如in-range

(define (iota x)
  (for ([i (in-range 1 (add1 x))])
    (printf "~a " i)))

或者对于使用显式递归的更标准的解决方案 - 这应该适用于大多数解释器:

(define (iota x)
  (cond ((positive? x)
         (iota (- x 1))
         (display x) 
         (display " "))))

无论哪种方式,它都按预期工作:

(iota 10)
=> 1 2 3 4 5 6 7 8 9 10 

答案 1 :(得分:2)

基本上你想使用递归。所以想想它正在计算中。当你计算好数字时,你已经添加了足够多的数字而且你已经完成了列表的构建,你需要将当前的数字添加到列表中并继续下一个数字。

查看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))
            )))

但是要获得你想要的函数,你需要从你指定的常量(即1)开始,所以让我们创建一个方便的函数来调用range和你需要设置的起始值递归,有时称为启动递归:

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

你可以在没有使用lambda的第二个函数的情况下完成它,但这是我见过的非常常见的风格。

一旦构建了所需的数字列表,您只需使用

显示它
(display (range 10))

答案 2 :(得分:2)

;; 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)))

答案 3 :(得分:0)

(define (iota x)
 (if (>= x 1)
   (begin
     (iota (- x 1))
     (display x)
     (newline))))

答案 4 :(得分:-1)

(define iota2
  (lambda (y)
    (let loop ((n 1))
      (if (<= n y)
          (cons n (loop (+ n 1)))
          '()))))