2016-10-02 48 views
0

所以我需要編寫一個遞歸解決方案,它可以通過列表的目錄和子目錄並添加文件大小。我沒有計劃經驗,我的教授也沒有回到我身邊。我嘗試過幾次不同的嘗試,但都以錯誤結束。如果有人能夠幫助我,我將不勝感激,因爲我沒有足夠的時間來完成這項任務。解析Scheme中的列表並獲得所有數字的總和

(define disk '("D" "main" 
(
    ("F" "file1.txt" (30)) 
    ("F" "file2.txt" (11)) 

    ("D" "sub1" 
    (
     ("F" "file1.txt" (1234)) 
     ("F" "file2.txt" (2345)) 
     ("F" "file3.txt" (3456)) 
    ) 
    ) 
    ("D" "sub2" 
    (
     ("F" "file1.txt" (1234)) 
     ("F" "file2.txt" (2345)) 
     ("F" "file3.txt" (3456)) 
    ) 
    ) 
) 
) 
) 

(define (getEnd n) 
    (let ((n 1))) 
    (let ((m 0))) 
    (member 3 '(disk.n)) 
    (+ m (getEnd (+ n 1))) 

) 

當我運行代碼,我總是得到這個錯誤:

  Ill-formed special form: (let (...)) 

我已經使用功能之外的let語句嘗試,但它仍然無法正常工作,因爲我不知道如何計劃的作品。我已經和同學們聯繫了,他們也看不出來。

任何幫助將不勝感激,謝謝!

+0

檢查文檔,這不是我們如何使用'let' - 語法不正確 –

+0

此代碼看起來更像C代碼而不是Scheme代碼。 –

回答

0

A let是一個本地綁定變量,它存在於主體或表單中。那就是:

(let ((n 1))   ; bind one variable 1 
    (display (+ n n)) ; use n for something 
)     ; end of let. `n` no longer exist. 

既然你有標籤的Java,C方言,這是一樣的:

{ 
    int n = 1; 
    System.out.println(n + n); // use n for something 
} 
// end of block. n no longer exist 

在你的代碼有沒有使用表達式的約束力,如果允許它就沒命了代碼,就像這樣:

{ 
    int n = 1; 
} 
// end of block. n no longer exist 

代碼(member 3 '(disk.n))總是#f'(disk.n)是一個符號,disk.n(equal? 3 'disk.n) ; ==> #f

最後一行(+ m (getEnd (+ n 1))通過增加n確實無條件遞歸列表。它不彙總結構中的任何數值。

問題

看來你可以檢查列表是通過查看第一個元素的文件或目錄或者是「F」或「d」因此,你可以做:

(define (file? lst) 
    ; todo: implement 
) 

(file? '("F" "file1.txt" (1234))) ; ==> #t 
(file? '("D"())     ; ==> #f 

(define (directory-elements dir) 
    ; todo: implement 
) 

(directory-elements '("D" "D" (("F" "F1" (1234)) ("F" "F2" (2345))))) 
; ==> (("F" "F1" (1234)) ("F" "F2" (2345))) 

您可以使得到的大小的程序:

您可以通過檢查目錄的第三個要素得到的文件列表文件:

(define (file-size file) 
    ; todo: implement 
) 

(file-size '("F" "F1" (1234))) 
; ==> 1234 

現在你可以使用上面的那些讓你的目標過程:

(define (size file-or-dir) 
    (if (file? file-or-dir) 
     (file-size file-or-dir) 
     (directory-elements-size (directory-elements file-or-dir))) 

(size '("F" "F1" (1234))) ; ==> 1234 
(size '("D" "D" (("F" "F1" (1234)) ("F" "F2" (2345))))) ; ==> 3579 

你缺少directory-elements-size。這可以通過遞歸進行:

(define (directory-elements-size lst) 
    (if (null? lst) 
     <???>         ; size of an empty directory 
     (+ (size <????>)      ; add the size of first file/dir 
     (directory-elements-size <????>)))) ; with the size of the rest of the elements 

你走了。你應該已經足夠讓你走了。

相關問題