chongming 发表于 2023-7-27 20:27

求C语言用递归写一道题,最好有注释

一看到这种就头晕,半天不知道怎么写{:1_932:}

侃遍天下无二人 发表于 2023-7-27 22:18

本帖最后由 侃遍天下无二人 于 2023-7-29 10:53 编辑

斐波那契数列, f(1) = 1, f(2) = 1, f(3) = f(2) + f(1),...
递归写法自己上网查,不想用递归也完全可以迭代的

---------
才发现要输出40个月的,你确定要用递归吗,别忘了递归的复杂度接近 2^n

cattie 发表于 2023-7-27 22:19

本帖最后由 cattie 于 2023-7-27 22:28 编辑

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int born; //第n年有多少兔子出生
    memset(born,0,sizeof(born)); //初始化
    for(int i=1;i<21; i++)
    {
      if(i<3) born = 0;//前两月没有兔子出生
      else if (i<6) born = 2; //3 4 5月每月出生一对兔子
      else
      {
            for(int j = 1; j<=i-3; j++)
                born += born;// 三个月前出生的所有兔子已经成熟,每月出生三个月前成熟所有兔子数量的兔子
            born += 2; //再加上之前的一对兔子
      }
      //cout<<born<<endl; //Debug用
    }
    for(int i = 1; i <= 20; i++)
    {
      static int sum = 2;
      sum += born;
      cout<<sum<<endl;
    }
}
时间复杂度O(n^2),嗯还好,也就是打表的水平。
不知道思路对不对,我算法很渣的。{:301_972:}

tflyr 发表于 2023-7-27 23:14

本帖最后由 tflyr 于 2023-7-27 23:16 编辑

#include <stdio.h>

// 定义递归函数,计算第n个月兔子的总数
long long int rabbit(int month) {
    // 基准情况:前两个月兔子的总数为1对
    if (month == 1 || month == 2) {
      return 1;
    }
    // 递归情况:第n个月兔子的总数等于前两个月兔子总数之和
    return rabbit(month - 1) + rabbit(month - 2);
}

int main() {
    int numMonths = 40;

    for (int i = 1; i <= numMonths; i++) {
      long long int rabbitPairs = rabbit(i);
      printf("第%d个月的兔子总数为:%lld\n", i, rabbitPairs);
    }

    return 0;
}


以上代码由AI生成

SineL 发表于 2023-7-28 02:00

代码:
/*
每一对兔子在出生的第三个月就能(成熟)生育一对兔子,即第i个月每出生的一对兔子,在第i+2个月就相应生育一对新兔子。
那么,第k个月出生的兔子数目=第k个月时的成熟兔子总数=第k-2个月时的兔子总数数(k>=3)。
当月兔子总数=前一个月兔子总数+当月出生兔子总数。。
设第n个月的兔子总数为f(n),递推关系:f(n)=f(n-1)+f(n-2),n>=3
*/

#include<stdio.h>

//递归方法
int rabbit(int month){
    if(month<3){
      return 2;
    }
    return rabbit(month-1)+rabbit(month-2);//当月兔子总数=上月兔子总数+当月出生兔子总数
}

int main(){
    int months=0;
    scanf("%d",&months);
    for(int i=1;i<=months;i++){
      printf("第%d个月兔子总数=%d\n",i,rabbit(i));
    }
    return 0;
}

zhuxiangyu1024 发表于 2023-7-28 06:13

算法尽量靠搜素引擎很多人会讲解的很细,来论坛提问会很影响你的学习效率。

侃遍天下无二人 发表于 2023-7-28 09:20

cattie 发表于 2023-7-27 22:19
本帖最后由 cattie 于 2023-7-27 22:28 编辑
#include
using namespace std;


迭代的复杂度应该是O(n)才对。f=1, f=1,n≥2时,f = f + f,这就完了

cattie 发表于 2023-7-28 09:21

本帖最后由 cattie 于 2023-7-28 10:07 编辑

侃遍天下无二人 发表于 2023-7-28 09:20
迭代的复杂度应该是O(n)才对。f=1, f=1,n≥2时,f = f + f,这就完了
嗯,迭代快一点,我这是直接用时间换空间了{:301_977:}

Do_zh 发表于 2023-7-28 09:24

第三个数是前两个数之和。

侃遍天下无二人 发表于 2023-7-28 10:06

cattie 发表于 2023-7-28 09:21
嗯,递归快一点,我这是直接用时间换空间了

递归的复杂度才是接近O(n^2)的,而且更费栈空间,迭代只有O(n){:301_986:}
页: [1] 2
查看完整版本: 求C语言用递归写一道题,最好有注释