我正在尝试创建一个接受用户输入x
的函数,并显示从1到x的所有数字。不太清楚从哪里开始:
(define (iota x)
(if (>= x 1)
(display
答案 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)
基本上你想使用递归。所以想想它正在计算中。当你计算好数字时,你已经添加了足够多的数字而且你已经完成了列表或的构建,你需要将当前的数字添加到列表中并继续下一个数字。
(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)))
'()))))