删除方案中的每个第n项

时间:2016-02-12 15:06:24

标签: list recursion scheme

尝试以递归方式删除方案中的每个第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)
    > 

1 个答案:

答案 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)))))))