当前位置: 首页 > 知识库问答 >
问题:

递归函数复杂度的确定(大O表示法)

时宾实
2023-03-14
int recursiveFun1(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun1(n-1);
}

int recursiveFun2(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun2(n-5);
}

int recursiveFun3(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun3(n/5);
}

void recursiveFun4(int n, int m, int o)
{
    if (n <= 0)
    {
        printf("%d, %d\n",m, o);
    }
    else
    {
        recursiveFun4(n-1, m+1, o);
        recursiveFun4(n-1, m, o+1);
    }
}

int recursiveFun5(int n)
{
    for (i = 0; i < n; i += 2) {
        // do something
    }

    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun5(n-5);
}

共有1个答案

杜禄
2023-03-14

每个函数的时间复杂度(以大O表示):

int recursiveFun1(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun1(n-1);
}

这个函数在到达基本情况之前被递归调用n次,所以它的O(n),通常被称为线性。

int recursiveFun2(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun2(n-5);
}

这个函数每次被称为n-5,所以我们在调用函数之前从n中扣除五,但n-5也是O(n)。(实际称为n/5倍的阶数。且,O(n/5)=O(n))。

int recursiveFun3(int n)
{
    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun3(n/5);
}
void recursiveFun4(int n, int m, int o)
{
    if (n <= 0)
    {
        printf("%d, %d\n",m, o);
    }
    else
    {
        recursiveFun4(n-1, m+1, o);
        recursiveFun4(n-1, m, o+1);
    }
}

int recursiveFun5(int n)
{
    for (i = 0; i < n; i += 2) {
        // do something
    }

    if (n <= 0)
        return 1;
    else
        return 1 + recursiveFun5(n-5);
}

这里,for循环取n/2,因为我们增加2,递归取n/5,因为for循环是递归调用的,因此,时间复杂度

(n/5)*(n/2)=n^2/10,

由于渐近行为和最坏情况情景的考虑或大O正在争取的上界,我们只对最大项soO(n^2)感兴趣。

 类似资料:
  • 我在期中考试中遇到了这个问题,我不确定我的答案是O(n^2)。我想要有解释的答案,谢谢。

  • 我想确定两个函数的复杂性。 第一个我只需要知道我的解决方案是否正确,第二个是因为我正在努力寻找解决方案的两个递归调用,如果可能的话,最好进行工作,这样我就可以了解它是如何完成的。 第一: 尝试的解决方案: 第二: 任何帮助将不胜感激。 当做

  • 我正在学习算法和数据结构课程。 今天,我的教授说下面算法的复杂度是2n。 我一直等到课程结束,走近他,告诉他我真的相信这是一个O(n)算法,我做了计算来证明它,并想给他们看,但他继续说它不是,没有给我任何令人信服的解释。 该算法是递归的,具有以下复杂性: 我计算它是一个,这样: 让我们展开 当T中的项为1时,我们停止,即: n/(2i)=1== 替换后,我们获得 由于该算法是从关于合并排序的课程中

  • 在最近的一次测试中,我们得到了一个函数来计算未排序的ArrayList中出现了多少个double(不是原语double,而是一个项目出现了两次)。 我正确地确定了Big O复杂度为O(N^2),但由于我错误地确定了全部复杂度,因此只获得了部分学分。函数如下: 在他刚刚发布的考试解决方案中,他给出了这样的解释: 输入集合中有N个项,该方法通过一个缩减步骤反复调用自己,该步骤生成一个新索引N次,直到达

  • 给定已排序的两个单链表,合并这些列表。 示例: list1: 1 2 3 5 7 list2: 0 4 6 7 10 --- 尽管这个解决方案非常简单,并且有几个不同的问题实现,不管是否使用递归(如下所示http://www.geeksforgeeks.org/merge-two-sorted-linked-lists/见方法3), 我想知道这个实现有多复杂: 如果其中一个列表是空的,只需返回另一

  • 我很难确定简单递归方法的大O。我不知道当一个方法被多次调用时会发生什么。我想更具体地谈谈我的困惑领域,但目前我正试图回答一些硬件问题,为了不想作弊,我要求任何回复本文的人提出一个简单的递归方法,并对所述方法的大O进行简单解释。(最好是Java语言……我正在学习的一种语言。) 谢谢你。