循环将列表放入方案中n次

问题描述 投票:0回答:1

我正在尝试编写一个带有两个参数的函数,即一个列表和要循环的次数n。我一直在尝试实现一个let循环来调用helper函数,将结果保存到一个变量,然后将每个循环的n减1,然后在n达到0时停止,但是我不确定该怎么做。 。

这是我的代码:

; helper function to queue it once
    (define (queue lst)
      (if (empty? lst)
          '()
      (append (cdr lst) (list (car lst)))))

;main function that calls helper function 
(define (queueLoop n lst)
 (if (empty? lst)
      '()
  (let loop ((res (queue lst))
             (lst (queue lst)))
    (cond
     [(> n 0)
      ((- n 1) (loop (queue res) (rest lst)))]
     (else
      (loop (queue res) (rest lst)))))))
queue scheme racket
1个回答
0
投票

请记住,在Scheme中,大多数操作都不会mutate变量,相反,它们会在修改后返回一个新值。以这个为例:

(- n 1)

上面的行是not修改n的值,它将返回等于n减1的新值,除非您将其存储在某个地方或将其作为参数传递给函数调用,则该值将丢失(实际上就是这种情况)。

该过程的逻辑还有其他问题。您不应该使用append来构建输出列表,如果要在列表的末尾添加元素,最好将cons元素添加到reverse结果的末尾。正如我上面提到的,您实际上并没有降低n。如果我正确理解,这就是您要执行的操作:

(define (queueLoop n lst)
  (let loop ((res '())
             (lst lst)
             (n n))
    (cond [(empty? lst) (reverse res)]
          [(= n 0) (reverse res)]
          [else (loop (cons (first lst) res) (rest lst) (- n 1))])))

一些例子:

(queueLoop 10 '())
=> '()
(queueLoop 0 '(1 2 3 4 5))
=> '()
(queueLoop 10 '(1 2 3 4 5))
=> '(1 2 3 4 5)
(queueLoop 3 '(1 2 3 4 5))
=> '(1 2 3)
© www.soinside.com 2019 - 2024. All rights reserved.