Scala 尾部递归列出给定文件位置的所有子目录

Scala 尾部递归列出给定文件位置的所有子目录,scala,tail-recursion,Scala,Tail Recursion,我想获取给定文件位置的所有非空目录,例如: /src/abc /src/abc/123/123.txt /src/abc/abc/123.txt /src/abc/foo/123.txt def getAllDirectories(location: String): Seq[String] = { def go(toCheck: List[File], results: List[File]): Seq[File] = toCheck match { case head ::

我想获取给定文件位置的所有非空目录,例如:

/src/abc
/src/abc/123/123.txt
/src/abc/abc/123.txt
/src/abc/foo/123.txt
def getAllDirectories(location: String): Seq[String] = {

  def go(toCheck: List[File], results: List[File]): Seq[File] = toCheck match {
    case head :: tail =>
      val these = head.listFiles
      val directories = these.filter(_.isDirectory)
      val updated = if (these.size == directories.size) results else head :: results
      go(tail ++ directories, updated)
    case _ => results
  }

  go(new File(location) :: Nil, Nil).map(_.getPath)
}
我想得到Seq[String]

/src/abc/123
/src/abc/abc
/src/abc/foo
我使用这个代码

def getAllDirectories(location: String): Seq[String] = {

    def recursiveListDirectories(f: File): Seq[File] = {
      val these = f.listFiles
      val directories = these.filter(_.isDirectory)
      directories ++ directories.flatMap(recursiveListDirectories)
    }
    recursiveListDirectories(new File(location)).filter(t => !t.listFiles().forall(_.isDirectory)).map(_.getPath)
  }
我想知道如何使RecursiveListDirectory方法尾部递归


非常感谢您预先设置您的内部函数,以保存结果目录和仍需检查的目录的累积列表。尝试依次检查每个目录,将所有子目录添加到下一次调用的等待列表中。例如:

/src/abc
/src/abc/123/123.txt
/src/abc/abc/123.txt
/src/abc/foo/123.txt
def getAllDirectories(location: String): Seq[String] = {

  def go(toCheck: List[File], results: List[File]): Seq[File] = toCheck match {
    case head :: tail =>
      val these = head.listFiles
      val directories = these.filter(_.isDirectory)
      val updated = if (these.size == directories.size) results else head :: results
      go(tail ++ directories, updated)
    case _ => results
  }

  go(new File(location) :: Nil, Nil).map(_.getPath)
}

设置内部函数以保存结果目录和仍需检查的目录的累积列表。尝试依次检查每个目录,将所有子目录添加到下一次调用的等待列表中。例如:

/src/abc
/src/abc/123/123.txt
/src/abc/abc/123.txt
/src/abc/foo/123.txt
def getAllDirectories(location: String): Seq[String] = {

  def go(toCheck: List[File], results: List[File]): Seq[File] = toCheck match {
    case head :: tail =>
      val these = head.listFiles
      val directories = these.filter(_.isDirectory)
      val updated = if (these.size == directories.size) results else head :: results
      go(tail ++ directories, updated)
    case _ => results
  }

  go(new File(location) :: Nil, Nil).map(_.getPath)
}