Scala 简单递归算法的复杂度估计

Scala 简单递归算法的复杂度估计,scala,time-complexity,Scala,Time Complexity,我在Scala上写了一个代码。现在我想估计时间和内存的复杂性 问题陈述 给定一个正整数n,求和为n的最小完美平方数(例如,1、4、9、16等) 例如,给定n=12,返回3,因为12=4+4+4;给定n=13,返回2,因为13=4+9 我的代码 def numSquares(n: Int): Int = { import java.lang.Math._ def traverse(n: Int, ns: Int): Int = { val max = ((num: Int) =&

我在Scala上写了一个代码。现在我想估计时间和内存的复杂性

问题陈述

给定一个正整数
n
,求和为
n
的最小完美平方数(例如,1、4、9、16等)

例如,给定
n=12
,返回
3
,因为
12=4+4+4
;给定
n=13
,返回
2
,因为
13=4+9

我的代码

def numSquares(n: Int): Int = {
  import java.lang.Math._

  def traverse(n: Int, ns: Int): Int = {
    val max = ((num: Int) => {
      val sq = sqrt(num)
      // a perfect square!
      if (sq == floor(sq))
        num.toInt
      else
        sq.toInt * sq.toInt
    })(n)

    if (n == max)
      ns + 1
    else
      traverse(n - max, ns + 1)
  }

  traverse(n, 0)
}

这里我使用递归解决方案。所以IMHO的时间复杂度是O(n),因为我需要使用递归遍历数字序列。我说得对吗?我遗漏了什么吗?

也许更重要的是,您可能需要修复代码,因为它不正确
numSquares(12)
给出了
4
它不是O(N)。您不会递归N次,因为N-max比N小得多。我现在还不能证明,但我猜是O(log(n))哦,我太密集了。它是O(1),因为答案总是4或更少,并且你不需要迭代求平方和的其他方法。哦,是的。我已经读过了。但我不知道如何将它应用到我的案例中,它说,如果你的算法是正确的,它将永远不会产生超过4的答案。因此,它的递归次数不能超过3次(因为终止情况至少为1)。这是一个固定数,与N无关。所以,O(1)。但是,您的算法假设最小的平方数始终包含小于N的最大平方。这不是真的(根据您的算法,12=9+1+1+1,但4+4+4更短)。这意味着你需要尝试更多的平方组合,加起来等于N,这可能意味着它不能是O(1)。也许更重要的是,你可能想要修复代码,因为它是不正确的
numSquares(12)
给出了
4
它不是O(N)。您不会递归N次,因为N-max比N小得多。我现在还不能证明,但我猜是O(log(n))哦,我太密集了。它是O(1),因为答案总是4或更少,并且你不需要迭代求平方和的其他方法。哦,是的。我已经读过了。但我不知道如何将它应用到我的案例中,它说,如果你的算法是正确的,它将永远不会产生超过4的答案。因此,它的递归次数不能超过3次(因为终止情况至少为1)。这是一个固定数,与N无关。所以,O(1)。但是,您的算法假设最小的平方数始终包含小于N的最大平方。这不是真的(根据您的算法,12=9+1+1+1,但4+4+4更短)。这意味着你需要尝试更多的方块组合,加起来等于N,这可能意味着它不能是O(1)。