gpt4 book ai didi

scala - 具有多个参数列表的 Scala 方法中的尾递归

转载 作者:行者123 更新时间:2023-12-02 00:39:32 24 4
gpt4 key购买 nike

我有以下功能:

  @tailrec
def samePrefix[A](length: Int)(a: Vector[A], b: Vector[A]): Boolean = {
if(length<1) true
else{
if(a(length-1)==b(length-1)) samePrefix(length-1)(a, b)
else false
}
}

它检查两个向量是否具有相同的第一个元素,给定要检查的长度。

我想知道调用的部分是否

samePrefix(length-1)(a, b)

首先从 samePrefix(length-1) 创建一个函数对象,然后将 (a,b) 应用于它,或者如果它只是调用我的方法 tail -递归地。

最佳答案

让我们看看...

$ scala
Welcome to Scala version 2.11.1
Type in expressions to have them evaluated.
Type :help for more information.

scala> import scala.annotation._
import scala.annotation._

scala> @tailrec def curried(a: Int)(b: Int): Int = curried(a-1)(b-1)
curried: (a: Int)(b: Int)Int

scala> :javap curried
... irrelevant output removed ...

public int curried(int, int);
flags: ACC_PUBLIC
Code:
stack=3, locals=3, args_size=3
0: iload_1
1: iconst_1
2: isub
3: iload_2
4: iconst_1
5: isub
6: istore_2
7: istore_1
8: goto 0

... irrelevant output removed ...

如您所见,字节码中没有递归调用。相反,有一条 goto 0 指令指示循环。这意味着尾调用优化已经发生。

您还会注意到,在编译的字节码中,多个参数列表已被压缩为单个参数列表,因此不涉及中间函数。

编辑:实际上,我们实际上不必检查字节码即可 100% 确定该方法已使用 TCO 进行编译,因为 @tailrec 注释完全存在为了这个目的。换句话说,如果您将 @tailrec 放在您的方法上,并且它编译时没有错误,那么您可以 100% 确定它是使用 TCO 编译的。

关于scala - 具有多个参数列表的 Scala 方法中的尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24355193/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com