原题链接:[递归]母牛的故事
解题思路:
第n年的母牛的来源分别来自于前一年剩下的和往前推3年的母牛(能生的母牛,最早的也算在里面)
| 第一年 | 第二年 | 第三年 | 第四年 | 第五年 | 第六年 | 
| 1 | 2 | 3 | 4 | 4(第四年)+2(第二年)=6 f(5-1) + f(5-3) = 6 f(4) + f(2) = 6  | 6(第五年)+3(第三年)=9 f(6-1) + f(6-3) = 9 f(5) + f(3) = 9  | 
    
6 = 前一年剩下的4头牛+(第2年新产的母牛刚具有生育能力生下的1头+最早的母牛1头)
        解题公式:f(n) = f(n-1) + f(n-3)
注意事项:
解法1 递归 
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        while(true){
            int n = sc.nextInt();
            if(n==0)break;
            System.out.println(f(n));
        }
        
    }
    
    public static int f(int n){
        //前四天没有母牛出生
        if(n<=4){
            return n;
        }
        //上一天出生数加前三天的出生数
        return f(n-1)+f(n-3);
    }
    
}解法2 记忆型递归+剪枝 避免计算重复子问题
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        while(true){
            int n = sc.nextInt();
            if(n==0)break;
            System.out.println(f(n));
        }
        
    }
    
    public static Integer[] arr = new Integer[999];
    
    public static int f(int n){ 
        //前四天没有母牛出生       
        if(n<=4){
            arr[n]=n;
            return n;
        }
        //剪枝避免计算重复子问题
        if(arr[n]!=null){
            return arr[n];
        }
        //记住存储结果 以便复用
        arr[n]=f(n-1)+f(n-3);        
        return arr[n];
    }
}解法3 动态规划
import java.util.Scanner;
public class Main{
    public static void main(String[] args){
        
        Scanner sc = new Scanner(System.in);
        int [] arr = new int[999];
        while(true){
            int n = sc.nextInt();
            if(n==0)break;
            for(int i = 1;i <= n;i++ ){
                //前四天没有母牛出生    
                if(i<=4){
                    arr[i]=i;
                }else{
                    arr[i]=arr[i-1]+arr[i-3];
                }
            }
            System.out.println(arr[n]);
        }
        
    }
    
}0.0分
91 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
大神帮我看看这个为什么不行 Scanner sc = new Scanner(System.in); int n=sc.nextInt(); int m=4; int y=1; if(n<=4) System.out.print(n); else{ for(int i=5;i<=n;i++){ y++; m+=y; } System.out.println(m); }#include <stdio.h> #include <stdlib.h> int swap(int arr[],int n); int main() { int n,a,i; scanf("%d",&n); int *arr=malloc((n+1)*sizeof(int)); for(i=1;i<=4;i++) { arr[i-1]=i; } a=swap(arr,n); printf("%d",a); free(arr); return 0; } int swap(int arr[],int n) { if(n<=4) { return arr[n-1]; } else { return swap(arr,n-1)+swap(arr,n-3); } }大神们能帮忙看下这样做为什么不行吗? #include<stdio.h> int main() { int n,sum=0; scanf("%d",&n); if(n<=4) sum=1+n-1;//四年前都是1头老母牛和n-1头小母牛 else sum=n-3+n-1;//四年后都是n-3头老母牛和n-1头小母牛 printf("%d",sum); }#include<stdio.h> int main() { int year; scanf("%d",&year); //printf("%d \n",year); int b1,b2,b3; b2=b3=0; b3=1; int sum; sum=1; for (int i=2;i<=year;i++) { int m,n; m=n=0; m=b1; b1=b3; n=b2; b2=m; b3+=n; sum=b1+b2+b3; //printf("%d %d %d %d \n",b1,b2,b3,sum); } if(year==0) { } else { printf("%d",sum); } return 0; } 这样写正确吗@持言的yll 你的代码存在问题是因为你在for循环的判断条件和循环更新部分中都使用了变量 n。这样做会导致循环进入后 n 的值立即加一,直接跳过了初始值为5的情况,从而导致错误。另外,在最后输出的语句中,你使用了循环结束后的 n 值,这会超出数组范围。使用了另一个变量 i 作为循环索引,而不是使用 n。这样可以避免跳过初始值为5的情况。同时,在输出结果时,使用修正后的 n 值来获取对应年份的母牛数。#include <stdio.h> int main() { int a[56] = {0, 1, 2, 3, 4, 5}; int n; printf("请输入年份:"); scanf("%d", &n); if (n >= 5) { for (int i = 5; i <= n; i++) { a[i] = a[i - 1] + a[i - 3]; } } printf("第%d年的母牛数是%d ", n, a[n]); return 0; }#include<stdio.h> int main() { int a[56]={0,1,2,3,4,5}; int n; scanf("%d",&n); if(n>=5) { for(n=5;n++;n<55) { a[n]=a[n-1]+a[n-3]; } } printf("第%d年的母牛数是%d",n,a[n]); return 0; 这个为什么不对