阅读这篇文章就证明你已经开始踏上了算法的修仙之路,接下来我会两天更,介绍图解算法里面的算法的实现, 适合Java程序员阅读。
前言
提示:这里可以添加本文要记录的大概内容:
接上一篇文章, 这篇文章是练习中等难度的递归, 为后面学习快速排序, 打好基础, 循循渐进, 慢慢来。
提示:以下是本篇文章正文内容,下面案例可供参考
一、求数组的总值
1. 题目
求,myList = {2,4,6} 的总和不用循环
2. 代码
public class RecursionDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(4);
list.add(6);
Integer totalValue = totalValue(list,0);
System.out.println("sum = " + totalValue);
}
public static Integer totalValue(ArrayList<Integer> list, Integer index) {
if(index == list.size() - 1){
return list.get(index);
}
return list.get(index) + totalValue(list, ++index);
}
}
3.分析
对于求和而言, 循环肯定比递归更加容易懂且性能高。 对于这个题目的关键在于你如何把循环里面i值也转化到递归中去。所以我就用了每次递归index都进行++操作, 递归结束条件也是小于数组长度。
二、计算列表包含的元素数
1. 题目
编写一个递归函数来计算列表包含的元素数不用循环和内置函数
2. 代码
public class RecursionDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(4);
list.add(6);
Integer totalItem = totalItem(list,0);
System.out.println("total = " + totalItem);
}
public static Integer totalItem(ArrayList<Integer> list, int index) {
if(list.size() == index){
return index;
}
return totalItem(list,++index);
}
}
3.分析
我们的最终目的是为了练习递归,虽然Java里面有api去求数组的长度,自己现实一下也是可以的,这一题和上一题一样,也是利用了递归执行++操作,然后再利用数组的长度为递归的结束条件,最后index的最终值也是数组的长度 -1。
三、计算列表包含的元素数
1. 题目
找出列表的最大的数字 分别用循环和递归实现一遍。
2. 代码
public class RecursionDemo {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(2);
list.add(4);
list.add(6);
Integer maxItem = getMaxItem(list);
Integer maxItemIndex = 0;
Integer maxItem1 = getMaxItem1(list,0,maxItemIndex);
System.out.println("循环法 max = " + maxItem);
System.out.println("递归法 max = " + maxItem1);
}
public static Integer getMaxItem(ArrayList<Integer> list) {
Integer maxItemIndex = 0;
for(int i = 0; i < list.size(); i++){
if(list.get(maxItemIndex) < list.get(i)){
maxItemIndex = i;
}
}
return list.get(maxItemIndex);
}
public static Integer getMaxItem1(ArrayList<Integer> list,Integer index,Integer maxItemIndex) {
if(list.get(maxItemIndex) < list.get(index)){
maxItemIndex = index;
}
if(index == list.size()-1){
return list.get(maxItemIndex);
}
return getMaxItem1(list,++index,maxItemIndex);
}
3.分析
对于求最大值, 其实递归和循环都有共同之处,都需要一个一个判断,然后选出一个最大值, 不同之处在于实现原理不同。递归需要基线条件和递归条件,而这一题的基线条件就是数组长度和循环结束的条件一样,只是方式不同。
总结
上一篇文章是介绍了递归的原理,这篇文章主要是给兄弟练练手的题目,如果想挑战更难的难度,可以去做汉诺塔问题,快速排序等问题。这一篇文章就是练习练习递归,让大家知道递归可能有时候比循环好,也可能比循环差,这需要自己去判断。
|