Recursion 创建从列表中给出偶数列表的lisp函数

Recursion 创建从列表中给出偶数列表的lisp函数,recursion,scheme,racket,Recursion,Scheme,Racket,我想为类创建一个函数,它将两个参数L和L1作为列表,并将L中的所有偶数放入L1中 我已经试了好几个小时,但不幸的是我做不到 这是我的方案代码: (定义(对L L1) (续) ((和(非(空?L))(=(模(第一个L)2)0)) (开始(追加(列表(第一个L))L1(对(其余L)L1))) ((和(非(空?L))(=(模(第一个L)2)1)) (对(其余L)L1) (其他L1) )) 我假设您想使用L1作为累加器,并在最后返回其内容 关于您的代码: 如果L为空(null?),在cond的第一个子句

我想为类创建一个函数,它将两个参数
L
L1
作为列表,并将
L
中的所有偶数放入
L1

我已经试了好几个小时,但不幸的是我做不到

这是我的方案代码:

(定义(对L L1)
(续)
((和(非(空?L))(=(模(第一个L)2)0))
(开始(追加(列表(第一个L))L1(对(其余L)L1)))
((和(非(空?L))(=(模(第一个L)2)1))
(对(其余L)L1)
(其他L1)
))

我假设您想使用
L1
作为累加器,并在最后返回其内容

关于您的代码:

  • 如果
    L
    为空(
    null?
    ),在
    cond
    的第一个子句中检查一次就足够了

  • append
    在需要追加列表时可以。在本例中,您附加了一个元素,因此
    cons
    更好

  • 你不需要取一个数的模来检查它是否是偶数。有内置的
    偶数?
    谓词

  • 因此,在考虑了所有这些因素之后,您的代码应该如下所示:

    (定义(对L L1)
    (条件((空?L)L1)
    ((偶数)(第一个L))
    (对(其余L)(cons(第一个L)L1)))
    (其他(对(其余L)L1)))
    
    现在让我们测试一下:

    >(成对(01 2 3 4 5 6 7)()
    (6 4 2 0)
    
    如您所见,它以相反的顺序返回数字。这是因为当我们在列表
    L
    中从头到尾向下移动时,我们将
    cons
    新值添加到列表
    L1
    的头部(而不是尾部,就像
    append
    那样)。要修复它,在第一个
    cond
    子句中
    (反转L1)
    就足够了,而不是简单地返回
    L1


    我强烈推荐《小阴谋家》这本书。阅读后,即使在睡眠中,您也可以编写任何类型的递归函数;)

    我假设您想使用
    L1
    作为累加器,并在最后返回其内容

    关于您的代码:

  • 如果
    L
    为空(
    null?
    ),在
    cond
    的第一个子句中检查一次就足够了

  • append
    在需要追加列表时可以。在本例中,您附加了一个元素,因此
    cons
    更好

  • 你不需要取一个数的模来检查它是否是偶数。有内置的
    偶数?
    谓词

  • 因此,在考虑了所有这些因素之后,您的代码应该如下所示:

    (定义(对L L1)
    (条件((空?L)L1)
    ((偶数)(第一个L))
    (对(其余L)(cons(第一个L)L1)))
    (其他(对(其余L)L1)))
    
    现在让我们测试一下:

    >(成对(01 2 3 4 5 6 7)()
    (6 4 2 0)
    
    如您所见,它以相反的顺序返回数字。这是因为当我们在列表
    L
    中从头到尾向下移动时,我们将
    cons
    新值添加到列表
    L1
    的头部(而不是尾部,就像
    append
    那样)。要修复它,在第一个
    cond
    子句中
    (反转L1)
    就足够了,而不是简单地返回
    L1


    我强烈推荐《小阴谋家》这本书。阅读后,即使在睡眠中,您也可以编写任何类型的递归函数;)

    非常感谢,先生。这个答案非常丰富,因为这是我第一次使用lisp。非常感谢,先生。这个答案非常丰富,因为这是我第一次使用lisp