你在这里选择了一个相当棘手的问题。Math.Max 的计算并不重要,重要的是两个递归调用。
当 n == 1 时出现问题,因为您调用 rand (1),它调用未定义的 Random().nextInt (0) - 它应该返回 >= 0 且 < 0 的随机整数不可能。让我们希望它返回 0 - 如果不是,我们就有麻烦了。
recursiveFunction (n) 调用 recursiveFunction (n - 1),并使用随机 i 再次调用 recursiveFunction (i),0 <= i <= n - 2。让我们制作一个最大调用次数表,计数1 用于初始调用(假设 rand (1) 返回 0,并且每隔一个调用返回 n - 2):
n = 0: 1 calls
n = 1: 1 + 1 + 1 = 3 calls
n = 2: 1 + 1 + 3 = 5 calls
n = 3: 1 + 3 + 5 = 9 calls
n = 4: 1 + 5 + 9 = 15 calls
n = 5: 1 + 9 + 15 = 25 calls
n = 6: 1 + 15 + 25 = 41 calls
n = 7: 1 + 25 + 41 = 67 calls
n = 8: 1 + 41 + 67 = 109 calls
n = 9: 1 + 67 + 109 = 177 calls
n = 10: 1 + 109 + 177 = 287 calls
调用的数量增长很快,但不如 2^n 快。我会说它是 O (c^n),c = sqrt (1.25) + 0.5。这是最坏的情况;平均要少很多。