所以我需要编写一个递归解决方案,它可以遍历列表的目录和子目录,并添加文件大小。我没有计划经验,我的教授也没有回复我。我尝试了几次不同的尝试,但它们都以错误结束。如果有人能帮助我,我会非常感激,因为我没有多少时间来搞清楚这项任务。
file.txt
当我运行代码时,我总是会收到此错误:
file.txt
我尝试在函数之外使用let语句,但它仍然无效,因为我不知道方案是如何工作的。我已经联系了我的同学,他们似乎也无法弄明白。
任何帮助将不胜感激,谢谢!
答案 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
你去吧。你应该有足够的东西让你去。