【问题标题】:Optimization of simple functions containing loops or recursion优化包含循环或递归的简单函数
【发布时间】:2020-06-26 15:04:22
【问题描述】:

我正在处理 codewars 中的一个问题,我的代码可以运行,但它超时了。我尝试了递归和循环,但在简单的测试中都超时并以相似的时间计算。在我的新手能力范围内,我也不知道如何进一步优化。

递归:

def recursive(p: Int, n: Int, l: List[Int], x: List[Int]): List[Int] = {
  if (n == p)
    x
  else
    recursive(p, n + 1, l, (l.drop(p - n - 1).sum :: x))
}

def partsSums(l: List[Int]): List[Int] = {
  val a = l.length
  recursive(a, 0, l, List(0))
}

循环:

def partsSums(l: List[Int]): List[Int] = {
  val g = l.length
  var x = List(0)
  var n = 0
  while (n != g) {
    x = (l.drop(g - n - 1).sum) :: x
    n += 1
  }
  x
}

【问题讨论】:

  • l.scanRight(0)(_ + _)够了吗?
  • 没有挑战的链接或描述,很难评估你想要达到的目标,但话虽如此,当你的代码超时时,10 次中有 9 次可能无法优化您的出路。通常情况下,您必须重新考虑您的算法。
  • @esse 如何让堆栈确认您已解决?
  • @MatthewWyatt 我添加了一个答案,如果适合你,你可以接受。

标签: scala loops recursion optimization


【解决方案1】:

你的两个函数超时的原因是它们的时间复杂度都是 O(n^2)。实际上只需要 O(n)。一个简单的解决方案如下:

l.scanRight(0)(_ + _)

如果您更喜欢尾递归的解决方案,这个应该可以工作:

def rcumsum(xs: List[Int]): List[Int] = {
   def imp(ys: List[Int], cum: List[Int], acc: Int): List[Int] = ys match {
     case Nil   => cum
     case y::rs => imp(rs, (y+acc)::cum, y+acc)
   }
   imp(xs.reverse, List(0), 0)
 }

【讨论】:

    猜你喜欢
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-19
    • 2021-12-17
    相关资源
    最近更新 更多