java 代替递归_Java将递归改成迭代的通用方法

用Stack或LinkedList来实现内存中的出栈入栈过程,即可将递归改成循环。

第一个例子用求阶乘,顺便加了迭代方法。

import java.util.Stack;

public class Factorial{

public static void main(String[] args){

Factorial f = new Factorial();

System.out.println(f.recursion(5));

System.out.println(f.loop(5));

System.out.println(f.iteration(5));

}

/**

* 递归求阶乘

*/

public int recursion(int n){

if (n == 1) return 1;

return recursion(n-1) * n;

}

/**

* 循环求阶乘

*/

public int loop(int n){

Stack stack = new Stack();

int result = 1;

stack.push(n);

while(!stack.isEmpty()){

n = stack.pop();

result *= n;

if (n > 1) stack.push(n-1);

}

return result;

}

/**

* 迭代求阶乘

*/

public int iteration(int n){

int result = 1;

for(int i = 1; i <= n; i++){

result *= i;

}

return result;

}

}

第二个例子是快速排序。递归快排大量数量时,容易爆栈。这时可以改成循环。

import java.util.Random;

public class Sorts{

private static Random rand = new Random();

public static void main(String[] args){

int[] a = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62

,99,98,54,56,17,18,23,34,15,35,25,53,51};

quickSort(a);

System.out.println(Arrays.toString(a));

int[] a = {49,38,65,97,76,13,27,49,78,34,12,64,5,4,62

,99,98,54,56,17,18,23,34,15,35,25,53,51};

quickSortByLoop(a);

System.out.println(Arrays.toString(a));

}

/**

* 快速排序

* 递归实现

*/

private static void quickSort(int[] arr, int start, int end){

if (start >= end) return;

int base = arr[start + rand.nextInt(end-start+1)]; //中轴值

int left = start, right = end; //指示左右两端未排序的边界索引

int i = start; // 用于排序

while(i <= right){

if (arr[i] < base){ //小于中轴值则移到左侧

swap(arr, left++, i++);

}else if (arr[i] > base){ //大于中轴值则移到右侧

swap(arr, right--, i); //当前i位置的值未排序,故i不自增

}else{

i++;

}

}

//排完后left左侧均为小于base的数,right右侧均为大于base的数

quickSort(arr, start, left-1);

quickSort(arr, right+1, end);

}

/**

* 快速排序

* 循环实现

*/

private static quickSortByLoop(int[] arr){

Stack stack = new Stack();

int start = 0;

int end = arr.length - 1;

stack.push(start);

stack.push(end);

while(!stack.isEmpty()){

end = stack.pop(); // 顺序很重要

start = stack.pop();

if (start < end){ // 开始排序

int i = start;

int base = arr[start + rand.nextInt(end-start+1)]

int left = start;

int right = end;

while(i <= right){

if (arr[i] < base){

swap(arr, left++, i++);

}else if (arr[i] > base){

swap(arr, right--, i);

}else {

i++;

}

}

// ----右半边----

stack.push(right + 1);

stack.push(end);

// ----左半边----

stack.push(start);

stack.push(left - 1);

}

}

}

}

版权声明:本文为博主原创文章,未经博主允许不得转载。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值