java中的递归调用算法

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)  

如:1123581321···求出第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

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值