一、题目描述
股神问题:
买了一支股票,他知道从他买股票的那天开始,股票会有以下变化:第一天不变,以后涨一天,跌一天,涨两天,跌一天,涨三天,跌一天…依此类推。
为方便计算,假设每次涨和跌皆为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循环方法在数据量相对大的情况下都会比递归方法运行时间短,执行效率相对比较高。
当然这是因为递归算法在函数调用过程中,包括一些变量的初始化,函数的出栈入栈等等造成相对大的资源消耗导致的运行效率较低,但并不是大家认为的递归算法都是低效率的。通过优化的递归算法值得学习,还有树形结构、文件的相关操作都会用到递归算法。