Рекурсивный в хвостовой - PullRequest
0 голосов
/ 21 мая 2018

У меня есть следующий код

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.Есть намеки?

1 Ответ

0 голосов
/ 21 мая 2018

Вы уже преобразовали 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))
}
...