蓝桥杯试题:递归

活动发起人@小虚竹 想对你说:

这是一个以写作博客为目的的创作活动,旨在鼓励大学生博主们挖掘自己的创作潜能,展现自己的写作才华。如果你是一位热爱写作的、想要展现自己创作才华的小伙伴,那么,快来参加吧!我们一起发掘写作的魅力,书写出属于我们的故事。我们诚挚邀请你参加为期14天的创作挑战赛!

提醒:在发布作品前,请将不需要的内容删除。

 一、题目描述

输入一个自然数 n (n≤1000)n (n≤1000),我们对此自然数按照如下方法进行处理:

  1. 不作任何处理;

  2. 在它的左边加上一个自然数,但该自然数不能超过原数的一半;

  3. 加上数后,继续按此规则进行处理,直到不能再加自然数为止。

问总共可以产生多少个数。

输入描述

输入一个正整数 nn。

输出描述

输出一个整数,表示答案。

输入输出样例

输入

6

输出 

6

二、代码展示 

import java.util.Scanner;
// 1:无需package
// 2: 类名必须Main, 不可修改

public class Main {
    static int num = 1;
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n =scan.nextInt();
        f(n);
        System.out.println(num);
        scan.close();
    }
    public static void f(int n){
      
      if(n == 1){
        return ;
      }
      for(int i =1 ;i <= (int)n/2 ; i++){
        f(i);
        num++; 
      }
    }
}

三、优化

考虑到n的值会变大,递归的方法可能会使栈溢出,所以可以考虑用动态规划的方法来优化过程

import java.util.Scanner;

public class Main {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        int n = scan.nextInt();
        long[] dp = new long[n + 1];
        dp[0] = 1;
        for(int i = 1; i <= n; i++){
            for(int j = i; j <= n; j++){
                dp[j] += dp[j - i];
            }
        }
        System.out.println(dp[n]);
        scan.close();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值