gpt4 book ai didi

scala - 如何在尾递归函数中添加内联函数

转载 作者:行者123 更新时间:2023-12-03 07:51:17 25 4
gpt4 key购买 nike

假设我有以下尾递归函数:

@tailrec final def f1(i: Int, j: Int): Int = {
if (i < j) f1(i + 1, j)
else if (i < j * 2) f1(i + 2, j)
else i
}

有没有一种方法可以概括加法部分,同时将函数保持为尾递归函数?我尝试修改如下:

@tailrec final def f2(i: Int, j: Int): Int = {
def add(c: Int): Int = f2(i + c, j)
if (i < j) add(1)
else if (i < j * 2) add(2)
else i
}

但我收到以下错误:

could not optimize @tailrec annotated method f2: it contains arecursive call not in tail position else if (i < j * 2) add(2)

最佳答案

@tailrec 在这里不起作用,因为您正在调用不同的函数 add,而不是原始函数(即使我们知道它只是调用原始函数),所以我认为这在 Scala 2 中是不可能的。

由于您的目标似乎是消除在函数调用中重复常量的需要 - 这是您希望对这样一个内部函数做的所有事情,您希望使尾递归 - 您可以:

  1. 使内部函数尾部递归并使用外部作用域中的常量值:
final def f3(i: Int, j: Int): Int = {
@tailrec
def add(i: Int): Int =
if (i < j) add(i + 1)
else if (i < j * 2) add(i + 2)
else i
add(i)
}
  • [讨厌]由于尾递归函数编译为 while 循环,因此只需手动编写 while 循环、可变变量和所有内容(留给读者作为练习)。
  • 关于scala - 如何在尾递归函数中添加内联函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/77091169/

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