List 如何返回介于1和x之间的数字列表

List 如何返回介于1和x之间的数字列表,list,scheme,List,Scheme,我正在尝试创建一个函数,它接受用户输入,x,并显示从1到x的所有数字。不太确定从这里走到哪里: (define (iota x) (if (>= x 1) (display 如果您使用的球拍运气不错,您可以使用,例如范围内的: (define (iota x) (for ([i (in-range 1 (add1 x))]) (printf "~a " i))) 或者对于使用显式递归的更标准的解决方案,这应该适用于大多数解释器: (define (

我正在尝试创建一个函数,它接受用户输入,
x
,并显示从1到x的所有数字。不太确定从这里走到哪里:

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

如果您使用的球拍运气不错,您可以使用,例如范围内的

(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
),因此,让我们创建一个方便的函数,用设置递归所需的起始值调用
range
,有时称为启动递归:

(define (range X)
    (range-2 1 X `() ))
您可以不用使用lambda的第二个函数来实现它,但从我所看到的情况来看,这是一种非常常见的样式

一旦你构建了一个你需要的数字列表,你只需要使用

(display (range 10))
(定义iota2
(兰姆达(y)
(let循环((n1))

(如果(修改原始答案,而不是给出额外答案。很抱歉,原始答案是错误的,我正要将其删除。此答案只是给出答案,而不是教提问者或任何未来的搜索者如何处理此类问题。此外,它使用
循环
,这对初学者来说不是很好,因为在他们的水平上,他们经常需要先学习递归。抱歉,有点匆忙。我刚刚看到了一些我可以轻松回答的问题,稍后将提供更多信息。谢谢。@ArtB不,两者都是递归的。你调用
(你的名字…
,这个答案调用
(循环…
。没有区别。:)这里也没有“循环”。“循环”只是一个名称。它的名称是let。“递归”是语法属性;从语义上讲,您需要迭代(即使是使用语法递归函数定义的,但在Scheme中这并不是那么简单,因为它缺少,并且惯用的定义(如接受答案中的定义)是TRMC)。您的函数实际上是迭代的,但不幸的是选择了
append
使其成为二次函数。最好使用
cons
并最终反转(2n当然,在返回之前,我肯定可以在
range-2
中做
cons
,然后在
range
中做
reverse
。我更专注于如何处理这些问题。“不要教答案,教答案是一个的一般情况。”诸如此类。但是,是的,你的观点是非常正确的。顺便问一下,这种双功能技术有名字吗?不知道名字;一个是用户界面,另一个通常被定义为它的“内部”、“工作者”功能。在Haskell中,它被称为“工作者/包装器”.--关于
append
:最好永远不要使用它,除非你真的需要它。最好早点开始这个习惯。:)我想
append
是编译器在幕后优化它的事情之一,就像Java优化串联(即“+”)到
StringBuilder
而不是
Strint.concat()
(display (range 10))
(define iota2
  (lambda (y)
    (let loop ((n 1))
      (if (<= n y)
          (cons n (loop (+ n 1)))
          '()))))
;; 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)))
(define (iota x)
 (if (>= x 1)
   (begin
     (iota (- x 1))
     (display x)
     (newline))))