递归实例总结

因为对递归的不了解,学习了如下的实例:
1、三角数字
这里写图片描述

可以使用循环方式,也可以使用递归方法。

这里写图片描述

package triangle;
import java.util.Scanner;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.lang.*;
public class Triangle {
    static int number;
    public static void main(String[] args) throws IOException {
        System.out.println("enter a number:");
         /*Scanner scan = new Scanner(System.in);
         while(scan.hasNext())
         {
               number =scan.nextInt();
         }*/ ??
            number=getInt();
         int answer =triangle(number);
         System.out.println("triangle:"+answer);

    }
    public static int triangle(int n)
    {
        if(n==1)
            return 1;
        else
            return (n+triangle(n-1));
    }
    public static String getString() throws IOException
    {
        //InputStreamReader是字节流通向字符流的桥梁
        //OutputStreamWriter是字符流通向字节流的桥梁
        InputStreamReader is = new InputStreamReader(System.in);
        //为提高效率,将字符串进行缓冲区技术高效操作,使用bufferedreader
        BufferedReader b = new BufferedReader(is);
        //readline是字符流bufferedreader类中的方法
        String s =b.readLine();
        return s;
    }
    public static int getInt()throws IOException
    {
        String s = getString();
        return Integer.parseInt(s);
    }

}

过程如下图:
这里写图片描述

其实递归的本质是数学归纳法:是一种通过自身的语汇定义某事物自己的方法。

tri(n)=1 if n=1;
tri(n)=n+tri(n-1) if n>1;

2、阶乘
与三角数字相似,只不过基值条件为当n=0时,而不是1时。

int factorial(int n)
{
  if(n==0)
    return 1;
    else
    return (n*factorial(n-1));
  }

3、变位字
假设要列出一个指定单词的所有变位字,也就是列出该单词的全排列,不管是否是单词,则称为这个工作是变位一个单词或称为全排列一个单词。
当你自己写出时会发现可以写出的排列的数量是单词字母数的阶乘!

package triangle;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Anagram {
    static int size;
    static int count;
    static char[] arrchar=new char[100];

    public static void main(String[] args) throws IOException {
        System.out.println("enter a word:");
        String input= getString();
        size= input.length();
        count=0;
        for(int j=0;j<size;j++)
        {
            arrchar[j]=input.charAt(j);
        }
         doanagram(size);
    }
    public static void doanagram(int newsize)
    {
        if(newsize==1)
            return ;
        for(int j=0;j<newsize;j++)
        {
            doanagram(newsize-1);
            if(newsize==2)
                display();
            rotate(newsize);

        }
    }
    public static void rotate(int newsize)
    {
        int j;
        int position=size-newsize;
        char temp=arrchar[position];  //save first letter
        for(j=position+1;j<size;j++)  //shift others left
            arrchar[j-1]=arrchar[j];
        arrchar[j-1]=temp;    //put first on right ?

    }
    public static void display()
    {
        if(count<9)//?
            System.out.println(" ");
        System.out.print(++count +" ");
        for(int j=0;j<size;j++)
            System.out.print(arrchar[j]);
        System.out.print("  ");
        System.out.flush();
        if(count%6==0)
            System.out.print("");//??
    }
    public static String getString() throws IOException
    {
        InputStreamReader is= new InputStreamReader(System.in);
        BufferedReader b = new BufferedReader(is);
        String s =b.readLine();
        return s;
    }

}
结果:
enter a word:
cat

1 cat   
2 cta   
3 atc   
4 act   
5 tca   
6 tac  

4、递归的二分查找
想用最少的比较次数在一个有序数组中找出一个数据项,用二分法

package triangle;
public class BinarySearch {

    public static void main(String[] args) {
        int max=50;
        ordarray arr =new ordarray(max);
        arr.ins(34);
        arr.ins(22);
        arr.ins(11);
        arr.ins(66);

        arr.insertion();
        arr.display();
        int searchkey=66;

        if(arr.find(66)<=arr.size())
            System.out.println("found" +searchkey);
        else
            System.out.println("can't found");
    }
}

class ordarray
{
    private long[] a;
    private int num;
    public ordarray(int max)
    {
        a=new long[max];
        num=0;
    }
    public int size()
    {
        return num;
    }
    public int find(long searchkey)
    {
        return recfind(searchkey,0,num-1);  
    }
    private int recfind(long searchkey,int low,int high)
    {   
        int cur=(low+high)/2;
        if(a[cur]==searchkey)
            {System.out.println("找到啦");
            //System.out.println(cur);
            return cur; 
            } 

        else if(low>high)
            return -1;
        else
            if(a[cur]>searchkey)
                return recfind(searchkey,low,cur-1);
            else
                return recfind(searchkey,cur+1,high);       
    }
    public void ins(long value)
    {
        int n=0;
        a[num]=value;
        num++;
    }
    public void insertion()
    {
        int in,out;
        for( out=1;out<num ;out++)
        {
            long temp=a[out];
            in=out;
            while(in>0&&a[in-1]>temp)
            {
                a[in]=a[in-1];
                --in;
            }
            a[in]=temp;
        }
    }
    public void display()
    {
        for(int i=0;i<num;i++)
        {
            System.out.print(a[i]+" ");
            System.out.println("    ");
        }
    }
}

递归二分查找和非递归二分查找有相同的大O效率:O( logN )
递归的二分查找是分治算法的一个例子,把大问题分成两个相对来说更小的问题,并且分别解决每一个小问题。对于每一个小问题再进一步分成两个更小的问题,并且解决他们。直到易于求解的基值情况就可。在二分查找中,就有两个这样对自身的递归调用,但是只有一个真正执行了,取决于值的大小。

5、汉诺塔问题

递归算法:
假设想要把所有的盘子从塔源S移动到目标塔座上D,有一个中介塔座为I,假设S上有n个盘子,算法如下:
1、从S移动包含上面的n-1个盘子的子树到塔座I上;
2、从塔座S移动剩余的盘子(最大的盘子)到塔座D上;
3、从塔座I移动子树到塔座D上。

这里写图片描述

package triangle;

public class Towers {

    static int disks=3;

    public static void main(String[] args) {
     doTower(disks,'a','b','c');

    }
    public static void doTower(int top, char from ,char inter,char to)
    {
        if(top==1)
            System.out.println("disk1 from "+ from +" to " +to);
        else
        {
            doTower(top-1,from,to ,inter);//from->inter
            System.out.println("disk" +top +" from "+from +" to "+ to);

            doTower(top-1,inter,from,to); //inter->to   
        }
    }
}

具体执行过程如下:

这里写图片描述

就这样吧~

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值