假设我们有一个递归函数,只有在随机生成的参数满足某些条件时才会终止:
e.g:
{
define (some-recursive-function)
x = (random in range of 1 to 100000);
if (x == 10)
{
return "this function has terminated";
}
else
{
(some-recursive-function)
}
}
我理解对于无限循环,不会定义复杂性。 肯定终止的某些功能怎么样,但是在一段未知的时间之后呢?
找到平均时间复杂度就可以了。如果一个存在,如何找到更糟糕的案例时间复杂度?
提前谢谢!
编辑:有几个人指出,我完全错过了这个功能没有输入的事实。相反,我们假设:{define (some-recursive-function n)
x = (random in range of 1 to n);
if (x == 10)
{
return "this function has terminated";
}
else
{
(some-recursive-function)
}
}
这会改变什么吗?
答案 0 :(得分:0)
如果没有n的函数从上面限定函数的运行时,那么就没有运行时的上限。根据具体情况,运行时可能存在下限。我们也可以谈论预期的运行时,甚至将边界放在预期的运行时上,但这与一般情况下的边界不同,另一方面,与运行时本身的界限不同。
正如它目前所写的那样,当n小于10时,根本没有界限:该函数在任何情况下都不会终止。对于n> = 10,在任何情况下仍然没有上限 - 它可能需要任意长的时间来完成 - 但是在任何情况下的下限都是线性的(你必须至少读取n的值,它由N = ceiling(log n)位组成;您选择不大于n的随机数的方法可能需要额外的时间和/或空间)。这里的案例行为相当无趣。
如果我们根据输入的值(而不是长度)考虑函数的预期运行时间,我们观察到任何特定调用都有1 / n几率选择正确的随机数(同样,对于n> ; = 10);我们认识到,我们需要尝试获得一次的次数由几何分布给出,并且期望值为1 /(1 / n)= n。因此,预期的递归深度是输入值n的线性函数,因此是输入大小的指数函数,N = log n。我们恢复了预期的确切表达;因此,上限和下限都是线性的,这涵盖了所有情况(最佳,最差,平均等)我说递归深度,因为运行时还会有一个额外因子N = log n或更多,由于对前一段的观察。
答案 1 :(得分:-1)
您需要知道有“简单”公式来计算递归算法的复杂性,使用当然重现。
在这种情况下,我们显然需要知道什么是递归算法,因为在最好的情况下,它是O(1)(时间复杂度),但在最坏的情况下,我们需要添加O(n)(具有考虑到数字可能会重复到算法本身的复杂性。
我会把这个问题/答案放在更多设施上:
Determining complexity for recursive functions (Big O notation)