首页 > 其他分享 >蓝桥杯——巧妙地递归

蓝桥杯——巧妙地递归

时间:2023-01-04 11:26:29浏览次数:37  
标签:arr return 递归 int 巧妙 蓝桥 static public

一、切蛋糕思想

  • 对于递归,我们可以采用思想之一,切蛋糕思想。
  • 简而言之,就是将一个大问题,切成若干个小问题进行解决。
  • 递归三要素:找重复、找变化、找边界
  • 我们可以理解为,自己处理一小部分,剩下的部分交给别人处理(递归)
  • 分解为:直接量 + 小规模子问题

1.1 经典求阶乘

  • 求阶乘
    • jc(n):求n的阶乘 jc(n-1):求n-1的阶乘
    • 1.找重复: n*(n-1) ————子问题
    • 2.找变化:变化的量应该作为参数
    • 3.找边界:出口
public class 递归 {
    public static int jc(int n) {
        if(n == 1)
            return 1;
        return n * jc(n-1);
    }
}

1.2 打印i到j

  • 1.找重复:理解为我处理当前参数问题,剩下的部分交给这个函数处理(规模更小的子问题)
  • 2.找变化:变化的量应该作为参数
  • 3.找边界:出口
public static void print(int i, int j) {
        // 出口
        if(i > j) return;
        System.out.println(i);
        // 重复与变化
        print(i+1,j);
    }

1.3 数组求和

  • 当我们发现无法进行递归时,肯定是我们的参数不够
 public static int sum(int[] arr,int start) {
        if(start == arr.length)
            return 0;
        return arr[start] + sum(arr,start+1);
    }

1.4 翻转字符串

  • 使用递归对一个字符串进行翻转
public static String reverse(String str, int end) {
        if(end == 0)
            return ""+str.charAt(0);
        return str.charAt(end) + reverse(str,end-1);
    }

二、递归公式与等价转换思想

  • 和上面切蛋糕思想不同的是,这种问题我们无法进行切分,但是我们都可以转换成数学问题,当找到数学问题后进行等价转换即可。
  • 分解为:多个子规模小问题

2.1 经典斐波那契数列

  • F(n) = F(n-1) + F(n-2)
// 求斐波那契数列第n项的值
public static int fib(int n) {
        // 3. 找出口
        if(n == 1 || n == 2) return 1;
        // 1.找变化 | 2.找重复
        return fib(n-1) + fib(n-2);
    }

2.2 最大公约数

  • 经典的欧几里得算法也称之为辗转相除法
  • 通过最大公约数我们也可以判断两个数是否互质
  • F(m,n) = F(n,m%n)
public static int zzxc(int m, int n) {
        if(n == 0) return m;
        return zzxc(n,m%n);
    }

2.3 递归形式的插入排序

  • 同样是利用切分思想,我们对数组前k-1个元素进行排序
  • 最后处理最后一个单独的元素
  • 递归都是父问题转换成子问题
public static void insertArr(int[] arr, int k) {
        // 1.对数组前k-1个元素进行排序
        insertArr(arr, k - 1);

        // 2.将最后一个元素插入到排好序的数组中
        int temp = arr[k]; // 记录该数
        while(temp < arr[k-1]) { // 后一个数比前一个数小的情况,将大的数后移
            arr[k] = arr[k-1];  // 直到找到适合自己的位置为止
            k--;
        }
        arr[k] = temp;
    }

三、搞不清楚的汉诺塔

  • 1~N从A移动到B,C作为辅助

等价于:

  1. 1~N-1从A移动到C,B为辅助

  2. 把N从A移动到B

  3. 1~N-1从C移动到B,A为辅助

	/**
     * 八、汉诺塔问题
     * 将N个盘子从source移动到target的路径打印
     * @param N 初始的N个从小到大的盘子,N是最大编号
     * @param from 原始柱子
     * @param help 辅助的柱子
     * @param to 目标柱子
     */
    public static void printHanoiTower(int N, String from, String to, String help) {

        printHanoiTower(N-1, from, help, to);
        System.out.println("move" + N + "from" + from + "to" + to);
        printHanoiTower(N-1, help, to, from);
    }

四、结尾

  • 对于蓝桥杯递归知识内容就总结这么多,若想深入学习等待后续更新。
  • 我将会继续更新关于蓝桥杯方向的学习知识,感兴趣的小伙伴可以关注一下。
  • 文章写得比较走心,用了很长时间,绝对不是copy过来的!
  • 尊重每一位学习知识的人,同时也尊重每一位分享知识的人。
  • 标签:arr,return,递归,int,巧妙,蓝桥,static,public
    From: https://www.cnblogs.com/lx-meteor/p/17024267.html

相关文章

  • 跑步锻炼 —— 蓝桥( Calendar类 详解)
    Calender使用:使用Calendar.getInstance()不仅能获取当前的时间,还能指定需要获取的时间点,在项目应用中达到定时的作用。Calender类在java.util包中。使用Calende......
  • 奇数窗口的递归平均滤波法
    网上的很多都看不懂,而且好像还有错,所以只好自己写了#递归平均滤波法,N=3importscipy.signalassignalimportnumpyasnpimportpylabasplimportmatplotlib.pyp......
  • 求第n个斐波那契数。(用递归和循环的方法对比)
    写这个代码的过程中出现的问题及改进方法:用递归实现#include<stdio.h>intFib(intn){if(n<=2)return1;elsereturnFib(n-1)+Fib(n-2);}......
  • 1.2 SMU Winter 2023 蓝桥杯模拟赛 1
    [蓝桥杯2013省B]带分数题意:给n,使满足式子a+b/c=n,其中a,b,c共同恰好由1,2...9组成,求a,b,c的取值种数思路1:枚举出9个数的全排列(可使用next_permutation()),再用两重循环暴......
  • 寒假第一次洛谷蓝桥个人赛 题解+补题(下)
    D.灵能传输##神仙结论把前缀和应用到极致,6先考虑三个数a,b,c,进行一次变换也就是a+b,-b,c+b可见三个数之和不变,也就是s[3]不变然后之前的s[1]+b,愿称之为s[2]之前的s......
  • 递增序列——蓝桥(简单)
    题目描述对于一个字母矩阵,我们称矩阵中的一个递增序列是指在矩阵中找到两个字母,它们在同一行,同一列,或者在同一 4545 度的斜线上,这两个字母从左向右看、或者从上向下......
  • 1、尾递归及优化 ,例:斐波那契数列 2、递归转循环,蹦床函数
    1、函数调用自身,即为递归,在return时调用自身,即为尾递归;递归非常消耗内存,其原因是需要同时保存成成百上千的调用帧,这容易发生栈溢出错误;但是尾递归只存在一个调用帧,所以永......
  • 简单聊聊:递归,缓存,分治,回溯
    一、初识递归递归函数=终止条件+递归关系终止条件:当大问题被拆解成能轻松解决的小问题时,运行终止条件中的逻辑递归关系:定义如何将大问题拆解为小问题例子:小名跑步。......
  • 算法基础之全排列(递归)
    全排列(递归)全排列就是从第一个数字起每个数字分别与他后面的数进行交换。去重的全排列就是从第一个数起每个数分别与它后面非重复出现的数字交换。全排列(不去重)//搜索/......
  • 函数和递归
    函数是什么库函数自定义函数函数参数函数调用函数的嵌套调用和链式访问函数的声明和定义函数递归函数是什么?维基百科定义:子程序在计算机科学中,子程序是一个大型程序中的部分......