Scheme 方案删除第一个实例的元素

Scheme 方案删除第一个实例的元素,scheme,racket,Scheme,Racket,我想删除列表中的第一个元素 范例 > (remove-first '(10 20 30 40 50 40 30 20 10) 10) (20 30 40 50 40 30 20 10) > (remove-first '(10 20 30 40 50 40 30 20 10) 40) (10 20 30 50 40 30 20 10) > (remove-first '("A" "B" "C" "d" "e" "F") "d") ("A" "B" "C" "e" "F") &g

我想删除列表中的第一个元素

范例

> (remove-first '(10 20 30 40 50 40 30 20 10) 10)
(20 30 40 50 40 30 20 10)
> (remove-first '(10 20 30 40 50 40 30 20 10) 40)
(10 20 30 50 40 30 20 10)
> (remove-first '("A" "B" "C" "d" "e" "F") "d")
("A" "B" "C" "e" "F")
> (remove-first '(10 20 30 40 50 40 30 20 10) 60)
(10 20 30 40 50 40 30 20 10)
> (remove-first (remove-first '(10 20 30 40 50 40 30 20 10) 40) 40)
(10 20 30 50 30 20 10)
但我不知道我的代码中缺少了什么,也许我陷入了一个无限循环

(define remove-first
  (lambda (li num)
    (if
      (= num (car li))
    (else
      (remove-first (cdr li) num)
    )
    )
  )
)

您应该研究用于遍历输入列表和构建输出列表作为答案的标准模板,相同的解决方案结构用于许多问题,并且您的代码目前不遵守该模板。其他错误包括:

  • 您缺少基本情况-遍历整个列表时会发生什么情况
  • 找到元素后,必须跳过它并添加列表的其余部分
  • 列表可以包含数字和字符串,因此有必要使用
    equal?
    进行比较,因为
    =
    仅适用于数字
  • 最后,当调用递归时,必须将当前元素添加到正在生成的输出列表中
这里有一个固定版本:

(define remove-first
  (lambda (li val)
    (cond ((null? li) '())
          ((equal? val (car li)) (cdr li))
          (else (cons (car li) (remove-first (cdr li) val))))))

您应该研究用于遍历输入列表和构建输出列表作为答案的标准模板,相同的解决方案结构用于许多问题,并且您的代码目前不遵守该模板。其他错误包括:

  • 您缺少基本情况-遍历整个列表时会发生什么情况
  • 找到元素后,必须跳过它并添加列表的其余部分
  • 列表可以包含数字和字符串,因此有必要使用
    equal?
    进行比较,因为
    =
    仅适用于数字
  • 最后,当调用递归时,必须将当前元素添加到正在生成的输出列表中
这里有一个固定版本:

(define remove-first
  (lambda (li val)
    (cond ((null? li) '())
          ((equal? val (car li)) (cdr li))
          (else (cons (car li) (remove-first (cdr li) val))))))

你的产出是多少?你有什么错误吗?你错过了基本情况。如果列表为空,您会怎么做?您的输出是什么?你有什么错误吗?你错过了基本情况。如果列表为空,您会怎么做?