您的位置:首页 > 其它

基础算法一一股神问题

2018-03-22 11:20 471 查看

一、题目描述

股神问题:

买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天…依此类推。

为方便计算,假设每次涨和跌皆为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:如有做的不好的地方或者有更好的算法,非常欢迎多多指教。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  算法 股神问题