2013-06-27 35 views
1

編寫一個過程(前半部分lst),返回一個包含其前半部分元素的列表。如果給定列表的長度是奇數,則返回的列表應該有(length - 1)/ 2個元素。Scheme返回一個包含其前半部分的列表

我給這些程序作爲例子,因爲我是新的計劃我需要你的幫助來解決這個問題。

(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) 

回答

4

這是非常簡單的在現有的程序方面來實現,請檢查您翻譯的文檔,以take程序的可用性:

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

除此之外,問題中提供的代碼基本上重新創建take,它看起來是正確的。剩下的唯一細節就是,如何獲得列表長度的一半?和上面一樣,只是使用quotient過程:

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

樓不是天花板。 :-)但是你可以使用'quotient'。 –

+2

@ ChrisJester-Young當然!修正它... –

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)))))) 
+0

+克里斯J-Y,感謝拼寫編輯。 + Chris T,我喜歡'list',而不是'lst' – GoZoner

0

另一種方式來處理它是具有在特定索引劃分列表的功能,並且然後一個包裝來計算地板(長度/ 2):

(define (cleave_at n a) 
    (cond 
    ((null? a) '()) 
    ((zero? n) (list '() a)) 
    (#t 
    ((lambda (x) 
     (cons (cons (car a) (car x)) (cdr x))) 
    (cleave_at (- n 1) (cdr a)))))) 

(define (first-half a) 
    (car (cleave_at (floor (/ (length a) 2)) a))) 
相關問題