蓝桥杯java B组递归数列求值

蓝桥杯


 

public class c2019 {
	public static void main(String[] args) {
		long[] arr = new long[20190324];
		System.out.println(solution(arr,20190324));
	}
	
	
	
	public static long solution(long[] arr,long n) {
		
		arr[1] = arr[2] = arr[3] = 1;
		if(n<=3) {
			return 1;
		}
		return  solution(arr,arr[(int)(n-1)]) + solution(arr,arr[(int)(n-2)]) + solution(arr,arr[(int)(n-3)]);
		
	}

}

求大家解答,这段代码哪里有问题

不能这样做,要用循环语句,不断的变化前4个变量的值

建议改成迭代的方式来做,因为实际上只需要用到 4 个变量就好了。然后 4 个变量的值相当于在不断的向后移动。

//这个计算是正常的,但数组太大,堆栈溢出了。

public static void main(String[] args) {
        long[] arr = new long[20190324];
        arr[0] = arr[1] = arr[2] = 1;
        arr[3]=3;
//        System.out.println(solution(arr,4));
        
        //测试
        int n = 20190324;
        for(int i=4;i<n;i++) {
            arr[i] = arr[i-1] + arr[i-2] + arr[i-3];
        }
        System.out.println(arr[n-1]);
    }
    public static long solution(long[] arr,int n) {
        if(n<=3) {
            return 1;
        }else if (n==20190323){
            return arr[n-1] % 10000;
        }else {
            arr[n] = arr[n-1]+arr[n-2]+arr[n-3];
            return solution(arr,n+1);
        }
    }

试下这段代码吧

public static void main(String[] args) {

        int [] arr = new int[20190324];
        arr[0] = 1;
        arr[1] = 1;
        arr[2] = 1;
        for (int i = 0; i <arr.length; i++) {
            if(i>2){
                arr[i] = arr[i-1]+arr[i-2]+arr[i-3];
            }
        }
        System.out.println("第20190324="+arr[20190323]);

    }

 

您好,我是有问必答小助手,你的问题已经有小伙伴为您解答了问题,您看下是否解决了您的问题,可以追评进行沟通哦~

如果有您比较满意的答案 / 帮您提供解决思路的答案,可以点击【采纳】按钮,给回答的小伙伴一些鼓励哦~~

ps:问答VIP仅需29元,即可享受5次/月 有问必答服务,了解详情>>>https://vip.csdn.net/askvip?utm_source=1146287632