这个尾部递归Scala的目的是什么?

这个尾部递归Scala的目的是什么?,scala,Scala,我看到这个方法: trait Compressioner { def ioStream(is: InputStream, os: OutputStream, bufferSize: Int = 4096): Int = { val buffer = new Array[Byte](bufferSize) @tailrec def doStream(total: Int): Int = { val n = is.read(buffer)

我看到这个方法:

trait Compressioner {
  def ioStream(is: InputStream, os: OutputStream, bufferSize: Int = 4096): Int = {
    val buffer = new Array[Byte](bufferSize)

      @tailrec
      def doStream(total: Int): Int = {
        val n = is.read(buffer)
        if (n == -1) total
        else {
          os.write(buffer, 0, n)
          doStream(total + n)
        }
      }

    doStream(0)
  }
所以我只是想看看我是否理解这一点。我们正在初始化一个字节数组(一个字节长8位,用来表示一个字符或字母),这就是我们的缓冲区(它是一个临时存储器,通常在内存中)

符号是什么


然后,我们每次从输入流读取4096个字节(通常每次读取4096个字符?)<代码>读取如果没有剩余内容,则返回-1,这是我们的最终条件。否则,我们将读取的字节写入输出流。这是正确的解释吗?我说得不准确吗?

实际上尾部递归与Scala无关。这是一种内存高效的递归,因为我们在计算结果时,不会将先前的结果保留在递归堆栈中,而是将答案保留为函数参数,因此,从递归返回时,我们不需要先前计算的值。这只是一种提高算法空间效率的方法。每个递归函数都可以写成一个尾部递归函数,但没有数学证明

有关尾部递归的更多信息,请参阅此链接。这更多的是对尾部递归的算法解释

比如说

阶乘程序的正规递归函数

def fact(n)={
If(n==0)
   return 1
  n*fact(n-1)
}
会发生什么,我们将下降到n==0 这样地。 事实(4)

但在返回1之前,我们需要在内存中调用所有其他函数,以最终计算阶乘

尾部递归函数

def factorial(n: Int): Int = {
  @tailrec
  def iter(x: Int, result: Int): Int =
if (x == 1) result
else iter(x - , result * x)

  iter(n, 1)
}


fact(5)
在尾部递归函数中,最后一个调用应该是我们应该记住的函数调用

特别是Scala,你可以参考这个

看到这个了吗
def factorial(n: Int): Int = {
  @tailrec
  def iter(x: Int, result: Int): Int =
if (x == 1) result
else iter(x - , result * x)

  iter(n, 1)
}


fact(5)