JAVA实习找工作——递归与循环

递归是一种很重要的思想和算法,我记得大学中很流行的编程比赛,比如蓝桥杯、ACM、程序设计天梯赛等等,很多题目都可以使用递归来求解。理解递归需要三句话:

(1)递归就是循环

(2)递归就是一个方法不断的调用自己

(3)递归需要一个出口,必须有if语句停止方法的调用

下面用三个简单的例子来说明一下递归

三个例子分别是输出0-9;对数组求和;判断字符串是否相等。

这三个例子都可以很好的使用for循环来解决,所以说递归和循环可以相互转化。下面分析一下思路:

对于第一题:输出0-9

先写f1(0,9);这就代表了会输出0-9折10个数;
在f1(int begin, int end)中,我们只打印begin这个数,后面的工作给别人做,这是在“踢皮球”;
当begin>end时,不能打印了,直接return,这是递归的出口

对于第二题:计算数组的和

先写f2(arr,0);表示从第0位开始计算数组中元素的和
在方法中计算arr[begin]+f2(arr,begin+1);表示我们只计算第0位的元素,后面的计算给别人做,这是“踢皮球”;
当begin等于数组中最后一位时,直接就返回这个位置的值,这是出口

对于第三题:比较字符串是否相等 

先写f3(str1, str2);表示比较str1和str2是否相同;
方法体中先比较字符串长度是否一样,不一样直接false,我们只比较第一个字母。后面的字母给别人比,这是“踢皮球”;
当比较到最后,字符串为空时那么字符串相同,这是出口
package com.note;

public class 递归和循环 {
    public static void main(String[] args) {
        //例1 从0输出到9
        f1(0,9);
        System.out.println("************************");
        //例2 对数组求和
        int[] arr = new int[]{1, 3, 5, 7, 8};
        int sum = f2(arr,0);
        System.out.println("sum:"+sum);
        System.out.println("************************");
        //例3 比较2个字符串是否相同
        String str1 = "abcd";
        String str2 = "abcd";
        boolean flag = f3(str1, str2);
        System.out.println("flag:"+flag);
        

    }

    private static boolean f3(String str1, String str2) {
        if (str1.length() != str2.length()) return false;
        if (str1.length() == 0) return true;
        if (str1.charAt(0) != str2.charAt(0)) return false;

        return f3(str1.substring(1), str2.substring(1));
    }

    private static int f2(int[] arr, int begin) {
        if (begin == arr.length-1) return arr[begin];
        return arr[begin]+f2(arr,begin+1);
    }

    private static void f1(int begin, int end) {
        if (begin > end) return;
        System.out.println(begin);
        f1(begin+1, end);
    }
}

所以,做好递归需要三步

(1)找重复:我做的部分+“踢皮球”给别人做的部分 

(2)找变化:变化的通常是递归方法的参数

(3)找边界:边界一般是递归的出口

关于递归这只是比较基础的题目,还有更加深层的题目之后会继续在这篇文章下更新。

发布了111 篇原创文章 · 获赞 60 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/Haidaiya/article/details/105249383