基础算法一一股神问题
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:如有做的不好的地方或者有更好的算法,非常欢迎多多指教。
相关文章推荐
- 算法基础之python实现动态规划中数字三角形和最长上升子序列问题
- JAVA代码—算法基础:活动安排问题(贪心算法)
- 算法基础之python实现深度优先搜索中城堡问题
- JAVA代码—算法基础:最大连续邮资问题求解
- 算法基础:最大递减数问题(Golang实现)
- 算法基础 - 2-sat问题
- 基础算法 01背包问题
- GIS基础算法之地图着色问题
- 算法基础之python实现枚举法中的讨厌的青蛙的问题
- Hall定理(二分图匹配问题,Hungary算法基础)
- C++基础算法学习——逆波兰表达式问题
- 算法基础:数组指定规则排序问题(Golang实现)
- JAVA代码—算法基础:数塔问题(动态规划)
- 赛马网基本算法之一 (股神问题)
- 基础算法之最大子列求和问题
- 算法基础:用递归解决排列组合问题
- 算法基础_熄灯问题
- NYOJ 布线问题(prime 算法基础)
- 算法基础:大数求和问题
- 【算法基础】算法导论-最大子数组问题