我正在尝试编写一个带有两个参数的函数,即一个列表和要循环的次数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)))))))
请记住,在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)