基础算法一一股神问题

一、题目描述

股神问题:
买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天…依此类推。
为方便计算,假设每次涨和跌皆为1,股票初始单价也为1,请计算买股票的第n天每股股票值多少钱?

二、问题分析

将问题具体化:
这里写图片描述
通过将问题化解为子类问题后得知:每次的变化其实就是增加1、2、3、4、5、n次之后减1,首先我想到的是利用递归来解决该问题,但是递归的结束条件必须选好,之后我再利用while循环解决此问题得到方法二。

三、问题解决

1、方法一:利用递归解决

package com.demo1;

import java.util.Scanner;

public class Main {
    //初始值
    int price = 1;
    int days = 1;
    int add = 0;

    public  static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第n天(输出n天以前的所有价格):");
        int n = scanner.nextInt();
            main.getShare(n);
    }
    /**
     * 方法一、利用递归
     * @param n
     */
    public void getShare(int n) {
        add = add+1;//初始的“+”次数为1
        System.out.println("第"+days+"天"+": "+"股票值"+price+"元");
        for(int i=0;i<add;i++) {
            price = price+1;//价格+1
            days = days+1;//天数自动递增
            //判断当实际的天数大于我们想要输入的天数后,停止循环,输出结果
            if (days > n) {
                break;
            }else{
                System.out.println("第"+days+"天"+": "+"股票值"+price+"元");
            }
        }
        price = price-1;//价格减1
        days = days+1;//天数自动递增
        //递归:结束条件为当输入参数天数n大于等于实际天数
        if (days <= n) {
            getShare(n);//递归
        }
    }
}

结果:
这里写图片描述

2、方法二:利用while循环
(1)代码:

package com.demo1;

import java.util.Scanner;

public class Main {
    //初始值
    int price = 1;
    int days = 1;
    int add = 0;

    public  static void main(String[] args) {
        Main main = new Main();
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入第n天(输出n天以前的所有价格):");
        int n = scanner.nextInt();
            main.getShare1(n);
    }

    /**
     * 方法二利用while
     * @param n
     */
    public void getShare1(int n) {
        add = add+1;//初始的“+”次数为1
        System.out.println("第"+days+"天"+": "+"股票值"+price+"元");
        //类似于递归,同样也是对子类问题循环
        while(true) {
            for(int i=0;i<add;i++) {
                price = price+1;//价格+1
                days = days+1;//天数自动递增
                //判断当实际的天数大于我们想要输入的天数后,停止while循环,输出结果
                if (days > n) {
                    break;
                }
                System.out.println("第"+days+"天"+": "+"股票值"+price+"元");
            }
            add = add+1;
            price = price-1;//价格减1
            days = days+1;//天数自动递增
            //判断当实际的天数大于我们想要输入的天数后,停止while循环,输出结果
            if (days > n) {
                break;
            }
            System.out.println("第"+days+"天"+": "+"股票值"+price+"元");
        }


    }
}

(2)结果
这里写图片描述

两种方法的运行时间比较:

简单编写代码测试数据,从数据少的情况到数据大的情况分析。

(1)选择方法一输入n=10的数据。
这里写图片描述
选择方法一输入n=100的数据。
这里写图片描述
选择方法二输入n=1000的数据。
这里写图片描述

(2)选择方法二输入n=10的数据。
这里写图片描述
选择方法二输入n=100的数据。
这里写图片描述
选择方法二输入n=1000的数据。
这里写图片描述

  • 粗略测试之后得出的结论:while循环方法在数据量相对大的情况下都会比递归方法运行时间短,执行效率相对比较高。

  • 当然这是因为递归算法在函数调用过程中,包括一些变量的初始化,函数的出栈入栈等等造成相对大的资源消耗导致的运行效率较低,但并不是大家认为的递归算法都是低效率的。通过优化的递归算法值得学习,还有树形结构、文件的相关操作都会用到递归算法。

PS:如有做的不好的地方或者有更好的算法,非常欢迎多多指教。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值