递归(实现阶乘、斐波那契数列、汉诺塔)

/*被static所修饰的在方法区
  如果有生成对象,就在堆里
  如果在方法里面,就在栈上
class Base{

    public static int a = 10;//方法区
    public static final int A = 20;//方法区
    public int b = 30;//如果有生成对象==》堆
    public final int C = 40;//堆

    public static void fun() {
        int a = 10;//栈
        final int b = 20;//栈
    }
}

递归

  • 递归过程是指函数调用自身的过程
  • 函数过程每次调用它自身时,都会占用更多的内存空间以保存其局部变量的附加副本
  • 趋近于某个临界值 ,要有一个可以终止此递归的条件
  • 如果栈溢出,会导致StackOverflowError错误
    优点
    代码更简洁清晰,代码量少
    缺点
    1.递归由于是函数调用自身,而函数调用是有时间和空间的消耗的:每一次函数调用,都需要在内存栈中分配空间以保存参数、返回地址以及临时变量,而往栈中压入数据和弹出数据都需要时间。->效率
    2.递归中很多计算都是重复的,由于其本质是把一个问题分解成两个或者多个小问题,多个小问题存在相互重叠的部分,则存在重复计算,如fibonacci斐波那契数列的递归实现。->效率
    3.调用栈可能会溢出,其实每一次函数调用会在内存栈中分配空间,而每个进程的栈的容量是有限的,当调用的层次太多时,就会超出栈的容量,从而导致栈溢出。->性能

阶乘

public static int fac(int n) {
        int num = 1;
        if(n == 1){
            num = 1;
        }else{
            num = fac(n-1)*n;
        }
        return num;
    }

斐波那契数列

public static int fibonaci(int n){
        int f = 1;
        if (n == 1 || n == 2){
            return 1;
        }else{
          return fibonaci(n-1)+fibonaci(n-2);

        }
    }

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        for(int i = 1;i<=n;i++){
            System.out.print(fibonaci(i)+" ");
        }
    }

二分查找

 public static int binarySearch(int[] array,int key,int high,int low){
        low = 0;
        high = array.length-1;
        if (low>high) {
            return -1;
        }else {
            int mid = (low + high) / 2;
            if (key == array[mid]) {
                return mid;
            } else if (key < array[mid]) {
                return binarySearch(array, key, mid - 1, low);
            } else {
                return binarySearch(array, key, high, mid + 1);
            }
        }
    }

    public static void main(String[] args) {
        System.out.println("请输入你要查找的数字");
        Scanner input = new Scanner(System.in);
        int n = input.nextInt();
        int[] array = {1,2,3,4,5,6};
        System.out.println(binarySearch(array,n,0,array.length-1));
    }

汉诺塔

    public static void move(char pos1,char pos2) {
        System.out.print(pos1+"==>"+pos2 + " ");
    }

    public static void hanio(int n,char pos1,char pos2,char pos3) {
        if(n == 1) {
            move(pos1,pos3);
        } else {
            hanio(n-1,pos1,pos3,pos2);
            move(pos1,pos3);
            hanio(n-1,pos2,pos1,pos3);
        }
    }

    public static void main(String[] args) {
        hanio(1,'A','B','C');
        System.out.println();
        hanio(2,'A','B','C');
        System.out.println();
        hanio(3,'A','B','C');
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值