4

首先请注意,这是一个家庭作业问题,所以我不是在寻找直接的代码或类似的东西,只是为了有人可以帮助我解决我的逻辑。

作业在 DrRacket 中。问题问:

给定一个 FileSystem,我们将它定义为一个结构,它有两个字段,名称和内容,其中内容是目录或文件的列表;编写一个函数,为目录中的每个文件创建一个“.bak”文件名,并将其放在文件之后。

我完全迷路了。我的逻辑如下:如果内容列表中的第一件事是文件,只需使用该文件重新制作目录并添加一个附加“.bak”的新文件。这是我所能得到的 - 如果有一个子目录,我看不出如何解决问题,或者如何继续向下移动列表。

这是我的残暴代码:

(define (backup my-fs)
   (cond
     [(empty? (dir-contents my-fs)) empty]
     [(file? (first (dir-contents my-fs))) (make-dir (dir-name my-fs) (append      (backup-list (first (dir-contents my-fs)))(rest (dir-contents my-fs))))]
     [(dir? (first (dir-contents my-fs))) (backup (first (dir-contents my-fs)))]))

任何人都可以帮我解决这个问题吗?

4

2 回答 2

2

你的contents部分FileSystem是一个包含文件或目录的列表(这些列表包含......)。

正如您所指出的,这是一个基本的树遍历问题,您有三种情况:

  1. 列表为空
  2. 列表中的第一个元素是一个文件
  3. 列表中的第一个元素是目录

然后,您需要针对每种情况采取行动:

  1. 完毕
  2. 保留该文件名,创建一个新文件名,然后继续处理列表的其余部分
  3. 保留该目录,对其进行递归,并继续处理列表的其余部分

例如:

(define (traverse contents)
  (cond
    [(empty? contents) ... nothing to do ...]
    [(file? (first contents))              ;; if the first element's a file:
      (cons (first contents)               ;;   keep the file
       (cons (... make backup filename ... (first contents))  ;; make the backup
        (traverse (rest contents))))]      ;;   and recurse on the rest
    [(dir? (first contents)                ;; if the first element's a directory:
      (cons (traverse (first contents))    ;;   recurse on the first
            (traverse (rest contents)))])) ;;   and also recurse on the rest
于 2011-11-08T17:34:25.010 回答
1

您需要澄清您的数据定义。你写:

“给定一个文件系统,我们将其定义为具有两个字段的结构,名称和内容,其中内容是目录或文件的列表;编写一个函数,为目录中的每个文件创建一个“.bak”文件名并将其放在文件之后。”

这清楚地说明了文件系统是什么……如果您知道“目录”和“文件”是什么。您需要通过为“目录”和“文件”编写数据定义来澄清这一点。每一个都应该是一个单独的句子。它们可能非常简单,例如“文件表示为字符串”。

完成此操作后,编写一些 FileSystems 的示例。

于 2011-11-08T17:45:34.807 回答