解析Scheme中的列表并获取所有数字的总和

时间:2016-10-02 18:13:12

标签: list sum scheme

所以我需要编写一个递归解决方案,它可以遍历列表的目录和子目录,并添加文件大小。我没有计划经验,我的教授也没有回复我。我尝试了几次不同的尝试,但它们都以错误结束。如果有人能帮助我,我会非常感激,因为我没有多少时间来搞清楚这项任务。

file.txt

当我运行代码时,我总是会收到此错误:

file.txt

我尝试在函数之外使用let语句,但它仍然无效,因为我不知道方案是如何工作的。我已经联系了我的同学,他们似乎也无法弄明白。

任何帮助将不胜感激,谢谢!

1 个答案:

答案 0 :(得分:0)

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

你去吧。你应该有足够的东西让你去。