在Scheme中添加列表



问题接受一个列表,例如L =(4 11 16 22 75 34),并测试一个条件(模2),然后返回一个列表,其中包含列表中通过测试的所有项目,例如newL = (4 16 34)

代码如下:

(define clean-list
  (lambda (x)
    (list x (test x))))
(define test
  (lambda (x)
    (cond (= 0 (modulo (car x) 2)) 
          (cons (car x) (test(cdr x)))   
          (else (test(cdr x))))
    ))
输出:

   ((4 11 16 22 75 34) 0) 

我调试了代码,它进入(modulo (car x) 2)然后返回到clean-list并退出,所有这些都是在第一次运行之后,请解释一下为什么它在list的末尾返回0。此外,任何反馈或改进代码将不胜感激。

您缺少一组括号。您还错过了对递归触底的测试。

(define test
  (lambda (x)
    (cond ((eq? x '()) '())
          ((= 0 (modulo (car x) 2)) 
           (cons (car x) (test(cdr x))))
          (else (test(cdr x))))
    ))

演示

cond的一般语法为:

(cond (<test1> <result1>)
      (<test2> <result2>)
      ...)

在您的代码中,<test1>只是=,而不是(= 0 (modulo (car x) 2))

这是该函数的尾部递归版本。

(define test
  (lambda (x)
    (define (helper in out)
      (if (null? in)
        out
        (if (= 0 (modulo (car in) 2))
          (helper (cdr in) (append out (list (car in))))
          (helper (cdr in) out))))
    (helper x '())
    ))
(define clean-list
  (lambda (x)
    (list x (test x))))
(write (clean-list '(4 11 16 22 75 34)))
输出:

((4 11 16 22 75 34) (4 16 22 34))

p。当我在repl上测试代码时。因此,我必须将modulo更改为mod

相关内容

  • 没有找到相关文章

最新更新