递归题目

本秂侑毒 提交于 2020-01-18 00:42:39

一、递归和循环
 1.理论上,任何循环都可以重写为递归形式
 2.java不支持尾递归。
二、解决递归
 1.问题相似性
 2.递归出口。这里有时候可以通过添加参数来解决。
三、递归的原理
在这里插入图片描述
四、没写出口的时候,疯狂压栈,栈就会溢出。

循环、递归打印0-n

package cn.itcast.suanfa;

public class Test {

    public static void fun1(int n){
        if(n>0)
            fun1(n-1);
            /*
            * 如果n=0,会调用n=-1,错误
            * 如果n=1,会调用n= 0,正确
            * 所以应该是n>0
            * */

        System.out.println(n);
    }

    public static void fun2(int begin, int end){
        if(begin>end) return;//这个return可以运用为,结束条件后停止该函数
        System.out.println(begin);
            fun2(begin+1, end);

    }

    public static void main(String[] args) {

        //方法一:递归打印0-n
//        fun1(10);

        //方法二:循环打印0-n
        /*for (int i = 0; i < 10; i++) {
            System.out.println(i);
        }*/

        //递归打印从begin到end
        fun2(1,10);
    }
}

递归打印数组之和

package cn.itcast.suanfa;

public class Test2 {

    public static int addAll(int[] a){
        /**
         * 如果方法不是static,则必须通过新建对象后,用点.方法调用
         * 如果方法  是static,则可以直接调用
         */
        int sum = 0;
        for (int i = 0; i < a.length; i++) {
            sum+=a[i];
        }
        return sum;
    }

    //方法一:求arr数组,从begin到结束的元素和
    public static int addAll2(int[] a, int begin){
        if (begin == a.length)
            return 0;
        int sum = addAll2(a,begin + 1);
        return sum + a[begin];
    }

    //方法二:求arr数组,从begin到end的元素和
    public static int addAll3(int[] a, int begin, int end){
        if (begin > end)
            return 0;
        int sum = addAll3(a,begin + 1, end);
        return sum + a[begin];
    }

    public static void main(String[] args) {
        int[] arr = {2,3,4,6};
        //int sum = addAll(arr);
//        int sum = addAll2(arr,1);
        int sum = addAll3(arr,0,3);
        System.out.println(sum);
    }
}

判断两个字符串相等

package cn.itcast.suanfa;

/**
 * 判断两个字符串时候相等
 * 2020年1月17日11:27:36
 */
public class Test3 {

    //方法一:运用java已经写好的
    public static boolean isSameString(String s1, String s2){
        return s1.equals(s2);
    }

    //方法法二:递归
        /**
         * 判断第一个长度是否相等、人为
         * 判断第一个字符是否相等、人为
         * 剩下的字符由递归判断
         */
    public static boolean fun(String s1, String s2){
        if (s1.length() != s2.length()) return false;
        if (s1.length() == 0 /*&& s2.length() == 0*/) return true;//可以省略,因为第一句已经判断了
        if (s1.charAt(0) != s2.charAt(0)) return false;
        return fun(s1.substring(1),s2.substring(1));
        //s1.substring(1),去掉字符串的第一个。

    }

    public static void main(String[] args) {
        System.out.println(isSameString("abc","abcd"));
        System.out.println(fun("abc","abc"));
    }
}

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!