递归算法与分治思想

递归算法

直接或间接的调用自身的算法称为递归函数,采用栈结构,先调用的最后返回。

主要形式就是先纵后横,一个分支走到底,再退回一个到兄弟节点,依次回退。

列出递归的三种形式:切蛋糕、递推公式、等价转换。

递归要素:

  • 明确递归得到结果是什么
  • 提取重复的逻辑,缩小问题的规模不断递去(大部分问题由大向小递归)
  • 变化的参数
  • 明确递归的终止条件

阶乘函数:

  • 明问题:jiecheng(n) 返回n!
  • 找重复:n!=n*(n-1)!=n*(n-1)*(n-2)!=.....
  • 找变化:变化的量为参数
  • 找边界:边界时n=0时,返回1

public int jiecheng(int n){if (n == 1){return 1;//递归出口}else return n * jiecheng(n-1);//递归方程,从大到小}

字符串的翻转

  • 明问题:recerse(s) 返回s的翻转字符
  • 找重复:字符串的翻转等于最后一个字符+前n-1个字符的翻转....
  • 找变化:变化的量为字符串的长度,作为参数
  • 找边界:边界时长度为0时结束。
public static String reverse(String s,int n){if (n==0) return "";return s.charAt(n-1)+reverse(s,n-1);}

斐波那契数列(Fibonacci数列)

  • 明问题:Fibonacci(n) 返回n对应的斐波那契数
  • 找重复:n的斐波等于n-1的斐波+n-2的斐波
  • 找变化:变化的量为参数
  • 找边界:边界时n=1 || 2时,返回1

无穷数列1,1,2,3,5,8,13,21,34,55,……,称为Fibonacci数列。

斐波那契数列的分段函数(递归函数)为:

public int fibonacci(int n){if (n == 1 || n == 2){return 1;//递归结束位置}else return fibonacci(n-1) + fibonacci(n-2);//递归函数}

最大公约数

  • 明问题:辗转相除的m%n
  • 找重复:m与n的最大公约数由n与m%n的最大公约数决定...依次类推
  • 找变化:变化的量为m,n的取值。
  • 找边界:边界时m%n==0时,返回n
   public static int gcb(int m,int n){if (m%n==0) return n;return gcb(n,m%n);}

指数运算的改进

a^{n}:

基本思想改变底数与指数,将底数变为原来的平方,则相应的指数变为原来的二倍。

    private static int pow0(int a,int n) {if (n==0) return 1;int res=a;//底数int ex=1;//指数while(ex*ex<n){//ex*ex来判断下一层的res*res是否超过a的n次幂res=res*res;//改变底数ex*=2;//改变指数}return res*pow0(a,n-ex);//递归思想,递归剩余部分,不是2的倍数}

上楼梯问题

一共有n层楼梯,每次只能上1层或2层或3层,问一共有几种上楼的方法。

  • 明问题:walker(n) 返回n层楼梯的走法
  • 找重复:若第一次上1层,则变成求剩余n-1层有几种走法问题;若第一次上2层,则变成求剩余n-2层有几种走法问题;若第一次上3层,则变成求剩余n-3层有几种走法问题;
  • 找变化:楼梯的层数在发生变化
  • 找边界:当楼梯只有1层或2层或3层时分别有1种,2种,4种走法
private static int walker(int n) {//此函数返回上n层楼梯所需的时间if (n==0) return 0;if (n==1) return 1;if (n==2) return 2;if (n==3) return 4;return walker(n-1)+walker(n-2)+walker(n-3);}

递归排序 

  • 明问题:sort(nums,n)返回0~n排好序的数组
  • 找重复:对n个元素排序可以看作最后一个元素插入对前n-1个元素的排序
  • 找变化:变化的量为排序的边界值的取值。
  • 找边界:边界时n==0时结束
public static void sort(int []nums,int n){//n表示最后一个元素的索引if (n==0) return;sort(nums,n-1);int t=nums[n];int i=n-1;for (;i>=0;i--){if (nums[i]<=t) break;nums[i+1]=nums[i];//数组的插入操作}nums[i+1]=t;//最终空下来的位置时i+1}

瓷砖铺放问题

有⼀长度为N(1<=N<=10)的地板,给定两种不同瓷砖:⼀种长度为1,另⼀种长度为2,数⽬不限。要将这个长度为N的地板铺满,⼀共有多少种不同的铺法?

一共有n块砖,第一次铺两块就还剩f(N-2),第一次铺一块就还剩f(n-1)

public int cizhuan(int n){if (n == 1){return 1;}if (n == 2){return 2;}return cizhuan(n-1) + cizhuan(n - 2);}

 整数划分问题

将正整数n表示成一系列正整数之和:n=n1+n2+…+nk,其中n1≥n2≥…≥nk≥1,k≥1。正整数n的这种表示称为正整数n的划分。求正整数n的不同划分个数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/475812.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Python教程(26)——Python迭代器和生成器详解

迭代器 Python中的迭代器是一种对象&#xff0c;它可以迭代&#xff08;遍历&#xff09;一个可迭代对象&#xff08;比如列表、元组或字符串&#xff09;的元素。迭代器用于实现迭代器协议&#xff0c;即包含 __iter__() 方法和 __next__() 方法。 迭代器的工作原理是每次调…

15.一种坍缩式的简单——组合模式详解

当曾经的孩子们慢慢步入社会才知道&#xff0c;那年味渐淡的春节就像是疾驰在人生路上的暂停键。 它允许你在隆隆的鞭炮声中静下心来&#xff0c;瞻前顾后&#xff0c;怅然若失。 也允许你在寂静的街道上屏气凝神&#xff0c;倾听自己胸腔里的那团人声鼎沸。 孩子们会明白的&am…

【蓝桥杯】算法模板题(Floyd算法)

一.弗洛伊德算法 用途&#xff1a;用来求解多源点最短路径问题。 思想&#xff1a;Floyd算法又称为插点法&#xff0c;是一种利用动态规划的思想寻找给定的加权图中多源点之间最短路径的算法。 主要步骤&#xff1a; 1&#xff09;初始化&#xff1a;使用邻接矩阵初始化dis…

MySQL为什么改进LRU算法?

普通LRU算法 LRU = Least Recently Used(最近最少使用): 就是末尾淘汰法,新数据从链表头部加入,释放空间时从末尾淘汰. 当要访问某个页时,如果不在Buffer Pool,需要把该页加载到缓冲池,并且把该缓冲页对应的控制块作为节点添加到LRU链表的头部。当要访问某个页时,如果在…

单主模式和多主模式切换

1 组复制模式切换注意点 组复制有两种运行模式&#xff0c;一种是单主模式&#xff0c;一种是多主模式。这个模式是在整个组中设置的&#xff0c;由 group_replication_single_primary_mode 这个系统变量指定&#xff0c;而且在所有成员上必须保持一致。ON 表示单主模式&#…

Javaweb之SpringBootWeb案例之AOP通知顺序的详细解析

3.2 通知顺序 讲解完了Spring中AOP所支持的5种通知类型之后&#xff0c;接下来我们再来研究通知的执行顺序。 当在项目开发当中&#xff0c;我们定义了多个切面类&#xff0c;而多个切面类中多个切入点都匹配到了同一个目标方法。此时当目标方法在运行的时候&#xff0c;这多…

包教包会的Kotlin Flow教程

原文链接 包教包会的Kotlin Flow教程 公众号「稀有猿诉」 Kotlin中的Flow是专门用于处理异步数据流的API&#xff0c;是函数响应式编程范式(Functional Reactive Programming FRP)在Kotlin上的一个实现&#xff0c;并且深度融合了Kotlin的协程。是Kotlin中处理异步数据…

文件上传漏洞--Upload-labs--Pass02--Content-Type绕过

一、什么是 Content-Type 我们在上传文件时利用 Burpsuite 进行抓包&#xff0c;如下图所示&#xff1a; 上传文件后台的源代码可能会对 Content-Type 进行规定&#xff0c;设置白名单 或 黑名单&#xff0c;这时就要利用Content-Type绕过上传含有恶意代码的 php文件。 二、代…

1.3_1 操作系统的运行机制

文章目录 1.3_1 操作系统的运行机制&#xff08;一&#xff09;预备知识&#xff1a;程序是如何运行的&#xff08;二&#xff09;内核程序 vs 应用程序&#xff08;三&#xff09;特权指令 vs 非特权指令&#xff08;四&#xff09;内核态 vs 用户态内核态、用户态的切换 总结…

PCB差模辐射是如何产生的

在电路应用中,高频时钟信号往往会采用差分线传输模式,其优点是在提高速率的同时减小功耗和提高抗扰度,因此,差模辐射就成为电路正常工作的结果,是电流流过导体形成的环路所产生,差模辐射模型可以被模拟为一个小环形天线,对于一个面积为A的小环路,载有电流Idm,在远场中…

程序员可以做一辈子吗?大龄程序员出路在哪?

前言 随着2023年AI的出现&#xff0c;大家对待程序员工作有了一丝丝危机感&#xff0c;特别是今年整个IT行业进入了前所未有的寒冬期&#xff0c;让程序员不得不思考未来的职业发展。 甚至很多程序员一想到自己接近35岁&#xff0c;焦虑感油然而生&#xff0c;这也是大部分程…

WebService接口测试

WebService的理解 WebService就是Web服务的意思&#xff0c;对应的应用层协议为SOAP&#xff08;相当于HTTP协议&#xff09;&#xff0c;可理解为远程调用技术。 特点&#xff1a; 客户端发送的请求主体内容&#xff08;请求报文&#xff09;的格式为XML格式 接口返回的响…