尝试以递归方式删除方案中的每个第n项
(define x '(1 2 3 4 5 6 7 8 15 10))
(define ndelete
(lambda (alist nth) ;@params (list to delete items from) (nth intervals to delete items)
(cond [(null? alist) alist] ;if null, return empty list
[(if (= nth 1) (ndelete (cdr alist) nth))]
[else (list (car alist) (ndelete (cdr alist) (- nth 1)))]
)))
当我打电话时:
> (ndelete x 5)
输出应为:
(1 2 3 4 6 7 8 15)
但我得到空白输出:
> (ndelete x 5)
>
答案 0 :(得分:3)
在(= nth 1)
条件下,您跳过了该元素,但没有将nth
重置为5(或者无论初始值是什么)。这意味着它保持在1并且之后跳过了每个元素。
要解决这个问题,你需要一个内部函数来保持一个计数器,同时仍然让你保持最初的n
。这是我的解决方案(我选择计算到n
而不是n
):
(define (ndelete lst n)
(let recur ((i 1)
(rest lst))
(cond ((null? rest) '())
((= i n) (recur 1 (cdr rest)))
(else (cons (car rest) (recur (+ i 1) (cdr rest)))))))