【问题标题】:Recursive to Tail-recursive in scala在scala中递归到尾递归
【发布时间】:2018-05-21 01:59:02
【问题描述】:

我有以下代码

object TailRec
{
    def func1(n:Int) : Int =
    {
        if (n < 10)
            func2(n)
        else
            func1(n/10) + func2(n % 10)
    }

    def func2(n: Int) : Int =
    {
        @tailrec def _func2(n: Int, result: Int): Int =
        {
            if (n <= 1)
                result
            else
                _func2(n-1,n*result)
        }
        _func2(n,1)
    }

    def test(n: Int) : Boolean =
    {
        if (n > 2)
            n == func1(n)
        else
            false
    }

}

我设法重写了 func2 但我不太确定如何转换 bool 函数。我考虑了匹配和大小写,但我仍然需要调用 func1 来获取比较结果。另一个问题是如何分解 func1 本身的双重函数调用。有什么提示吗?

【问题讨论】:

  • 唯一返回类型为Boolean的函数是test。它不是递归的。你能澄清一下你到底想重写什么吗?
  • 任务是使算法尾递归。我已经重写了 func2,但我被困在如何重写其余部分。

标签: scala recursion tail-recursion


【解决方案1】:

您已经将func2 转换为尾递归形式。 类似地,使用附加的累加器,您可以将func1 转换为尾递归形式(我已经修改了func1 的接口,但您也可以创建另一个内部辅助函数)。由于test 不是递归的,所以这里不需要做任何事情。

import scala.annotation.tailrec

object TailRec {
  @tailrec def func1(n:Int, acc: Int): Int = {
    if (n < 10) func2(n)
    else func1(n / 10, acc + func2(n % 10))
  }

  def func2(n: Int): Int = {
    @tailrec def _func2(n: Int, result: Int): Int = {
      if (n <= 1) result
      else _func2(n-1,n*result)
    }
    _func2(n,1)
  }

  def test(n: Int): Boolean = (n > 2) && (n == func1(n, 0))
}

【讨论】:

  • 布尔值让我很头疼,但它当然已经是最终的了。非常感谢你,先生 - 你让我很开心:)
猜你喜欢
  • 2018-03-17
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2017-11-11
  • 1970-01-01
  • 2017-04-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多