递归到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 本身的双重函数调用。有什么提示吗?
您已经将 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))
}
我有以下代码
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 本身的双重函数调用。有什么提示吗?
您已经将 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))
}