簡體   English   中英

在scala中遞歸到尾遞歸

[英]Recursive to Tail-recursive in scala

我有以下代碼

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本身中拆分double函數調用。 有什么提示嗎?

您已經將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))
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM