java中的递归调用算法
定义:【在一个方法内部,对自身进行调用,逐层传递,直到问题的出口,就会依次返回】
阶乘:一个数n的阶乘
public class Test {
static int multiply(int n){
if(n==1||n==0)
return n;
else
return n*multiply(n-1);
}
public static void main(String[] args){
System.out.println(multiply(5)); //例如这个数是5
}
}
fibonacci数列,第三个数的值等于第一第二个值的和(n>2)
如:1,1,2,3,5,8,13,21···求出第n个数是什么
public static int f(int n){
if(n==1 || n==2)
return 1;
else
return f(n-1)+f(n-2);
}
此处只给函数的方法体,若有兴趣的朋友可以把代码自行补全
若有分支(使用非递归调用方法实现)
非递归的方法
public static long f(int index){
if(index<1) {
system.out.println("invalid parameter");
return -1;
}
if(index == 1 || index ==2) {
return 1;
}
long f1 = 1L;
long f2 = 1L;
long f = 0;
for(int i=0; i<index-2;i++) {
f = f1 + f2;
f1 = f2;
f2 = f;
}
return f;
}
组合
两组数组,使用递归算法,组成新的数组。此例子是在网站摘抄的,
在此分享,想知道其他的解法,还请告知
例如:
String a[]={"a","b","c"};
String b[]={"e","f","g"};
//要求使用递归方法,得到如下结果:ae,af,ag,be,bf,bg,ce,cf,cg
public class digui {
public static void main(String[] args) {
String a[]={"a","b","c"};
String b[]={"e","f","g"};
//要求使用递归方法,得到如下结果:ae,af,ag,be,bf,bg,ce,cf,cg
String aa[]=new String[a.length*b.length];
int i=a.length*b.length;//即i=9
int j=a.length-1,k=b.length-1;//即j=2,k=2
dg(a,b,aa,i,j,k);//递归
printl(i,aa);//打印输出
}
public static void dg(String a[], String b[],String aa[],int i,int j,int k){
aa[i-1]=a[j]+b[k]; //在每次的递归调用中,把对应好的字符串赋值给数组aa[]
--i;
if(i>0){
if(k>0&&j>-1){ //a[]==>b[]数组a对应着数组b
--k;
dg(a,b,aa,i,j,k);
}else if(j>-1){
k=a.length-1;
--j;
dg(a,b,aa,i,j,k);
}
}else{
return;
}
}
public static void printl(int j,String aa[]){
for(int i=0;i<j;i++){
if(i!=j-1){
System.out.print(aa[i]+",");
}else{
System.out.print(aa[i]);
}
}
}
}
总结递归算法来说,这个根就是那个出口,只要找到这个出口所在,那么算法自然而然就能水到渠成了。
冒泡排序算法
public class BubbleSort {
public static void sort(int[] values) {
int temp;
for (int i = 0; i < values.length; ++i) {
for (int j = 0; j < values.length - i - 1; ++j) {
//在循环中,每一次都要从头开始比较大小,大的往后移,下一次循环比较是 //就不用再比较了
if (values[j] > values[j + 1]) {
temp = values[j];
values[j] = values[j + 1];
values[j + 1] = temp;
}
}
}
}
}
求最大公约数和最小公倍数
public class Convention {
/**
* 求两数的最大公约数
*/
int divisor(int m,int n){
if(m%n==0){
return n;
}else{
return divisor(n,m%n);
}
}
/**
* 求两数的最小公倍数
*/
int gbs(int a,int b){
int gbs = 0;
gbs = a*b/divisor(a,b);
return gbs;
}
}
【编程就是把我们的思想思维转换成函数代码】
如:编程一个简单的机器人系统的日常行程等
如是学生(一周的行程如何实现,过程会遇到什么样的问题,怎么解决等)
又或着是老师···
是位出租车司机呢···
做一个闹钟···
又或者是一个多少位计算器的设计···等等···很多现实生活中所用的或是解决问题的方法都可以用代码来实现的···非常有趣···你可以试试的···
以下题目是我在一次面试中遇到的java面试题,运用递归算法完成,以及一些相关类似的算法题
用程序在控制台打印出所有由“a”,“b”,“c”,“d”,这几个字符组成的一个或多个组成的且长度为4的字符串,字符可重复,如:”abba”,”abdc”等
·xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
package fz.digui;
import java.util.*;
class DiGui {//从一个字符串数组中随机抽取一个或多个字符串,然后组成一个字符串输出,字符串不重复
public static void main(String[] args) {
String[] str = new String[]{"a","b","c","d"};
ArrayList<String> all = new ArrayList<String>();
for(String s:str){
for(String p:str){
if(p.equals(s)){
continue;
}
for(String q:str){
if(q.equals(p)){
continue;
}
for(String m:str){
if(m.equals(s) || m.equals(p) || m.equals(q)){
continue;
}
all.add(m+s+p+q);
}
}
}
}
System.out.println(all);
}
}
重复的······是参照大神做法的······在此算是偷师了
package fz.digui;
import java.util.*;
public class DiGui {
// 随机变量
private static Random random = new Random();
// Set不重复的保存取到的结果
private static Set<String> list = new HashSet<String>();
// 待处理数组
private static String[] str = new String[] { "a", "b", "c", "d" };
// 计算排列总数
public static int getNumber(int len) {
if (len == 1) {
return 1;
} else {
return len * getNumber(len - 1);
}
}
// 随机取4个字符组合在一起
public static String getChar(String[] str) {
String result = "";
result += str[random.nextInt(str.length)];
result += str[random.nextInt(str.length)];
result += str[random.nextInt(str.length)];
result += str[random.nextInt(str.length)];
return result;
}
public static void main(String[] args) {
// 计算总数
int count = getNumber(str.length);
// 如果set里面数据不等于Count,继续计算
while (true) {
list.add(getChar(str));
if (list.size() == count)
break;
}
// 算完了,输出
for (String s : list) {
System.out.println(s);
}
}
}
·xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
package fz.digui;
import java.util.*;
public class DiGui {
public static void main(String[] args) {
int[] data = {3,5,6,8,9,15,18,24,27,30,32};
Random r = new Random();//创建随机数实例对象
StringBuffer str = new StringBuffer();//创建一个字符串缓冲区,初识容量为16字符
for(int i=0;i<5;i++){
//调用append附加含参数函数,使获取的伪随机int类型的数值转换成字符类型的字符串附加到str数组中去
str.append(data[r.nextInt(11)]);
}
System.out.println(str);
}
}
·xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
package fz.digui;
import java.util.*;
public class DiGui {
public static void main(String[] args) {
int i=0;
int j=0;
int[] temp = new int[20];
for(j=0;j<temp.length;j++){
temp[j]=(int) (Math.random()*100+1);//随机获取三个数值
System.out.println(temp[j]+",");//输出temp数组中的值
}
HashSet hh = new HashSet();//创建一个hashset序列对象hh
while(hh.size()<8){//把hh序列长度定制为8
int aa = (int)(Math.random()*100+1);
hh.add(aa);//把获取到的随机值添加到hh序列中
}
System.out.println(hh.size());
Iterator ii = hh.iterator();//创建一个迭代器对象ii,(返回一个迭代器在这个集合的元素。在没有特定的顺序返回的元素)
while(ii.hasNext()){//若为true,则返回一个元素否则退出结束
System.out.println(ii.next()+",");
}
}
}
·xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
import java.util.*;
class DiGui {//从数组s中选取多少字符串,然后在随机输出
public static void main(String[] args) {
Object s[] = {"abc1","abc2","abc3","abc4","abc5"};
method(s);
for(int i=0;i<5;i++){
System.out.println(s);
}
}
public static void method(Object[] m1){
if(m1.length == 0)
return;
List<Object> list = new ArrayList<Object>();
for(Object str:m1){
list.add(str);
}
int len = list.size();
int x = (int)(Math.random()*len);
Object str = list.remove(x);
System.out.println(str);
Object[] m = null;
m = list.toArray();
method(m);
}
}
·xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx