首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Scala尾部递归

Scala尾部递归
EN

Stack Overflow用户
提问于 2017-09-27 06:21:49
回答 1查看 434关注 0票数 3

所以我有一个递归函数,它把两个数字相乘,很简单。

代码语言:javascript
运行
复制
    def mul(n: Int, m: Int):Int =
        if(m > 1) n + mul(n, dec(m))
        else n

现在,我尝试将它转换为一个尾递归函数,我尝试了如下:

代码语言:javascript
运行
复制
    def mulWithTail(n: Int, m: Int):Int = {
        @tailrec
        def iter(result: Int, x: Int):Int =
            if(x == 0) result
            else result + iter(result, dec(x))
        iter(n, m)
    }

但是,我得到了以下错误:

错误:无法优化@ tail iter注释方法iter:它包含一个不位于尾部位置的递归调用 其他结果+iter(结果,12月(X))

问题:,你能解释一下为什么会发生这个错误吗?我应该如何重构我的代码?

EN

Stack Overflow用户

回答已采纳

发布于 2017-09-27 06:30:52

您可以使函数尾递归,只需添加一个额外的参数,就像累加器一样。就像这样。

代码语言:javascript
运行
复制
def mul(n: Int, m: Int, acc: Int): Int =
  if (m > 1) mul(n, m - 1, n + acc)
  else acc

要使函数尾递归,您不能在递归步骤中执行任何其他操作,而必须递归调用该函数。在您的代码示例中,您将在递归步骤中执行一个加法。

  • n + mul(n, dec(m))
  • result + iter(result, dec(x))
票数 8
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/46440770

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档