Scheme返回包含前一半元素的列表

Scheme返回包含前一半元素的列表,scheme,Scheme,编写一个过程(前半部分lst),返回包含前半部分元素的列表。如果给定列表的长度为奇数,则返回的列表应具有(长度-1)/2个元素 我被给予这些计划作为一个例子,因为我是新的计划,我需要你的帮助解决这个问题 (define list-head (lambda (lst k) (if (= k 0) '() (cons (car lst)(list-head (cdr lst)(- k 1))))))) (list-head '(0 1 2

编写一个过程(前半部分lst),返回包含前半部分元素的列表。如果给定列表的长度为奇数,则返回的列表应具有(长度-1)/2个元素

我被给予这些计划作为一个例子,因为我是新的计划,我需要你的帮助解决这个问题

(define list-head 
   (lambda (lst k)
      (if (= k 0)
         '()
          (cons (car lst)(list-head (cdr lst)(- k 1)))))))

(list-head '(0 1 2 3 4) 3)   
; list the first 3 element in the list (list 0 1 2)
此外,我想要的程序的预期输出为:

(first-half '(43 23 14 5 9 57 0 125))
(43 23 14 5)

就现有程序而言,这很容易实现,请查看您的口译员文档以了解该程序的可用性:

(define (first-half lst)
  (take lst (quotient (length lst) 2)))
(define (first-half lst)
  (list-head lst (quotient (length lst) 2)))
除此之外,问题中提供的代码基本上是重新设计的
take
,看起来是正确的。剩下要实现的唯一细节是,如何获得列表长度的一半?如上所述,只需使用以下步骤:

(define (first-half lst)
  (take lst (quotient (length lst) 2)))
(define (first-half lst)
  (list-head lst (quotient (length lst) 2)))

就现有程序而言,这很容易实现,请查看您的口译员文档以了解该程序的可用性:

(define (first-half lst)
  (take lst (quotient (length lst) 2)))
(define (first-half lst)
  (list-head lst (quotient (length lst) 2)))
除此之外,问题中提供的代码基本上是重新设计的
take
,看起来是正确的。剩下要实现的唯一细节是,如何获得列表长度的一半?如上所述,只需使用以下步骤:

(define (first-half lst)
  (take lst (quotient (length lst) 2)))
(define (first-half lst)
  (list-head lst (quotient (length lst) 2)))

看起来您正在学习递归?一种递归方法是使用“慢”和“快”指针遍历列表;当快速指针到达终点时,您就完成了;使用慢速指针增长结果。像这样:

(define (half list)
  (let halving ((rslt '()) (slow list) (fast list))
    (if (or (null? fast) (null? (cdr fast)))
        (reverse rslt)
        (halving (cons (car slow) rslt)
                 (cdr slow)
                 (cdr (cdr fast))))))

看起来您正在学习递归?一种递归方法是使用“慢”和“快”指针遍历列表;当快速指针到达终点时,您就完成了;使用慢速指针增长结果。像这样:

(define (half list)
  (let halving ((rslt '()) (slow list) (fast list))
    (if (or (null? fast) (null? (cdr fast)))
        (reverse rslt)
        (halving (cons (car slow) rslt)
                 (cdr slow)
                 (cdr (cdr fast))))))

另一种方法是使用一个函数在特定索引处划分列表,然后使用包装器计算楼层(长度/2):


另一种方法是使用一个函数在特定索引处划分列表,然后使用包装器计算楼层(长度/2):


地板,而不是天花板。:-)但是你可以只使用
。地板,而不是天花板。:-)但是你可以使用
+chrisj-Y,谢谢你的拼写编辑+Chris T,我喜欢“列表”,而不是“lst”+Chris J-Y,谢谢你的拼写编辑+Chris T,我喜欢“列表”,而不是“lst”