Recursion 在方案中向列表和返回列表添加元素

Recursion 在方案中向列表和返回列表添加元素,recursion,scheme,racket,Recursion,Scheme,Racket,我试图定义一个函数,该函数接受字母列表,并返回删除最后一个元素的列表。我是scheme的新手,所以我不确定如果不在函数中创建变量是否可以实现这一点。 到目前为止,我从以下方面开始: define funct (lambda (x) (let (list '() ) (if ( < (length x) 2 ) list (append ( list (car x)) 定义函数(λ(x) (让(列出“()”) (如果(

我试图定义一个函数,该函数接受字母列表,并返回删除最后一个元素的列表。我是scheme的新手,所以我不确定如果不在函数中创建变量是否可以实现这一点。 到目前为止,我从以下方面开始:

define funct (lambda (x) 
    (let (list '() )
     (if ( < (length x) 2 ) list (append ( list (car x))
定义函数(λ(x)
(让(列出“()”)
(如果(<(长度x)2)列表(附加(列表(车辆x))
我能像这样简单地执行递归调用吗:

(if ( < (length x) 2 ) list (append ( list (car x)) (set x (cdr x)) lambda (x))
(如果(<(长度x)2)列表(附加(列表(车辆x))(集合x(cdr x))lambda(x))
或者这是大错特错了?

大错特错了,是的

理由如下:

  • 如果列表为空,或者只有1个元素,则返回空列表
  • 否则,保留第一个元素并与列表的其余部分重复(递归)
  • 代码:

    (define funct
      (lambda (lst)
        (if (or (null? lst) (null? (cdr lst)))
            '()
            (cons (car lst) (funct (cdr lst))))))
    
    测试:

    > (funct '())
    '()
    > (funct '(a))
    '()
    > (funct '(a b))
    '(a)
    > (funct '(a b c))
    '(a b)
    > (funct '(a b c d))
    '(a b c)
    

    Scheme程序很少包含的两个词是
    length
    set!
    。学会在没有它们的情况下生活。