import java.util.Arrays;
import java.util.Collections;
import java.util.List;
public class IterationAndRecursion {
public static void main(String[] args) {
int[] arr = { 1, 2, 3, 4, 5 };
System.out.println(sum1(arr, arr.length));
reverse(arr, 1, 4);
System.out.println(sum2(arr, 0, arr.length - 1));
max2(arr,0,arr.length);
max2better(arr,0,arr.length);
}
//数组中前2大元素改进
private static void max2better(int[] arr, int low, int high) {
int max1,max2;
if (arr[max1 = low] < arr[max2 = low + 1]) {
arr[max1] = arr[max1] ^ arr[max2];
arr[max2] = arr[max1] ^ arr[max2];
arr[max1] = arr[max1] ^ arr[max2];
}
for (int i = low + 2; i < high; i++) {
if (arr[i] > arr[max2]) {
if (arr[max2 = i] > arr[max1]) {
arr[max1] = arr[max1] ^ arr[max2];
arr[max2] = arr[max1] ^ arr[max2];
arr[max1] = arr[max1] ^ arr[max2];
}
}
}
System.out.println(arr[max1] + "," + arr[max2]);
}
//数组中前2大元素
private static void max2(int[] arr, int low, int high) {
int max1 = low,max2 = low;
for (int i = low + 1; i < high; i++) {
if (arr[max1] < arr[i]) {
max1 = i;
}
}
for (int i = low; i < max1; i++) {
if (arr[max2] < arr[i] ) {
max2 = i;
}
}
for (int i = max1 + 1; i < high; i++) {
if (arr[max2] < arr[i]) {
max2 = i;
}
}
System.out.println(arr[max1] + "," + arr[max2]);
}
// 数组求和线性递归
private static int sum1(int[] a, int n) {
return n < 1 ? 0 : sum1(a, n - 1) + a[n - 1];
}
// 数组求和二分递归
private static int sum2(int[] arr, int low, int high) {
if (low == high)
return arr[low];
int mid = (low + high) >> 1;
return sum2(arr, low, mid) + sum2(arr, mid + 1, high);
}
// 数组反转递归
private static void reverse(int[] arr, int i, int j) {
if (i < j) {
arr[i] = arr[i] ^ arr[j];
arr[j] = arr[i] ^ arr[j];
arr[i] = arr[i] ^ arr[j];
reverse(arr, i + 1, j - 1);
}
}
}