2013-06-23 60 views
1

我試圖編寫一個謂詞函數,當列表被定義爲拉鍊時返回TRUE。拉鍊被定義爲一個正確的列表,其中每個元素都是一個包含兩個元素的列表,並且可以是任何表達式。計劃拉鍊謂詞函數

(zipper? '((a 1)(b 2))) 
#t 
(zipper? '((a (1)) ((b) 2))) 
#t 
(zipper? '((a 1 2)(b 1))) 
#f 

我想首先檢查參數列表已滿,返回false一個例子,然後檢查名單的汽車其元素的長度,並通過列表的CDR回來雖然我的功能,但我很難讓它運行。

(define (zipper? l) 
    (if (empty? l) 
    #f 
    (if (> 1 (length car(l))) 
    #t 
    (zipper? (cdr (l)))))) 

任何想法我做錯了什麼,我該如何解決它?我仍然在學習計劃。

+1

「協會名單」是該數據結構的名稱。 [拉鍊](http://en.wikipedia.org/wiki/Zipper_(data_structure))是一種不同的野獸。 –

回答

2

對於這種情況,最好使用cond比一系列嵌套if S的,他們給你造成一定的麻煩。將一個判斷當前元素是否爲「zip」的謂詞抽取到一個單獨的過程中是一個不錯的主意。類似這樣的:

(define (zip? e) 
    (and (list? e) 
     (= (length e) 2))) 

(define (zipper? lst) 
    (cond ((null? lst) #t) 
     ((not (zip? (car lst))) #f) 
     (else (zipper? (cdr lst))))) 

當然,還有其他幾種方法可以解決這個問題。例如,使用布爾連接器,而不是條件語句:

(define (zipper? lst) 
    (or (null? lst) 
     (and (zip? (car lst)) 
      (zipper? (cdr lst))))) 

或使用球拍的andmap(如果不提供,使用SRFI-1的every):

(define (zipper? lst) 
    (andmap zip? lst)) 
+0

真棒謝謝你,Scheme比我以前想象的要靈活得多。 – Yoink

1

您的括號是錯誤的

(define (zipper? l) 
    (if (empty? l) 
    #f 
    (if (> 1 (length (car l))) 
    #t 
    (zipper? (cdr l)))))) 

的功能總是在表達式中的第一個元素,其餘的都是論據。而且它並不完全符合規格

(define (zipper? l) 
    (if (empty? l) 
    #t 
    (if (not (= 2 (length (car l)))) 
     #f 
     (zipper? (cdr l)))))) 
+2

縮進?! ....? :) –