算法4(一、递归学习)

article/2025/8/6 10:53:31

每次用递归都感觉有点难,这个趁着恶补基础知识的时候,专门看了一遍递归,算法4的。

1.1 递归介绍

方法可以调用自己,例如:下面给出了bin_search的二分查找的一种实现。(算法4中使用的是Java,但是我是c++系的,就用c++实现,语言不重要)。我们就会经常使用递归,因为递归代码比相应的非递归代码更加简洁优雅、易懂。下面这种实现中的注释就言简意赅地说明了代码的作用。

int bin_search(int key, int *a, int left, int right)
{//递归第一条,总是包含一个return的语句if(left > right) return -1;int middle = left + (right - left)/2;if(key < a[middle])  bin_search(key, a, left, middle-1);\else if(key > a[middle]) bin_search(key, a, middle+1, right);else return middle;
}

编写递归代码时最重要的有以下三点。

  1. 递归总有一个最简单的情况——方法的第一条语句总是一个包含return的条件语句。
  2. 递归调用总是去尝试解决一个规模更小的子问题,这样递归才能收敛到最简单的情况。在上面代码中,第四个参数和第三个参数的差值一直在缩小。
  3. 递归调用的父问题和尝试解决的子问题不应该有交集。在上面代码中,两个子问题各自操作的数组部分是不同的。

违背其中任意一条都可能得到错误的结果或低效的代码,而坚持这些原则能写出清晰,正确且容易评估性能的程序。使用递归的另一个原因是我们可以使用数学模型来估计程序的性能。这个要在后面讲。

1.2 练习

看了递归的总结了之后,要做做练习题,控固一些递归的知识点,所以就做算法4,第一节的练习题。

1.1.16 给出exR1(6)的返回值

string exR1(int n)
{if(n < 0) return "";return exR1(n - 3) + n + exR1(n - 2) + n;
}int main()
{cout << "递归代码学习" << endl;string str = exR1(6);cout << str << endl;return 0;
}

c++好像不知道string加法,不过就这样吧,我们不执行了,直接推结果。
在这里插入图片描述
这里已经把递归的流程分析,递归分析不用慌,一层一层分析,知道返回的时候,就有结果了,这道题的答案是:311361142246。

1.1.17 找出一下递归函数的问题

string exR2(int n)
{string s = exR2(n -3)+ n + exR2(n -2)+ n;if(n < 0) return "";return s;
}

这一个是违反了递归的第一条性质,也就是第一条不包含return语句,这样导致递归函数一直递归,知道把栈搞溢出。

1.1.18 请看一下递归函数

int mustery(int a, int b)
{if(b == 0) return 0;if(b % 2 == 0) return mustery(a+a, b/2);return mustery(a+a, b/2) + a;
}

mustery(2, 25)和mustery(3, 11)的返回值是多少
在这里插入图片描述
这个递归比较简单,只要一个方向递归,像第一题两个方向递归才难。

1.1.19 在计算机上运行一下程序

long F(int N)
{if(N==0) return 0;if(N==1) return 1;return F(N-1)+F(N-2);
}

计算这段程序在一个小时之内能够得到的F(N)结果的最大N值是多少?这个有谁知道,可以讲解一波,我也不清楚。
开发F(N)的一个更好的实现,用数组保存已经计算过的值。

long F2(int N, long *value)
{//static long *value = new long[N];if(N == 0){value[0] = 0;value[1] = 1;return 0;}if(N == 1){value[0] = 0;value[1] = 1;return 1;}//printf("N %ld %ld %ld\n", N, value[N-1]+value[N-2]);value[N-1] = F2(N-1, value);return value[N-1]+value[N-2];
}

递归函数还是一贯都是开始是return,因为我们要从0,1开始,所以0,1需要做特殊处理,然后从2开始的话,我们就递归算出每个数组的值,然后利用已经保存好的数组的值,然后在相加,就得到了想要的结果。

1.1.20 编写一个递归的静态方法计算ln(N!)的值

unsigned long jieceng(int N)
{if(N == 1 || N == 0) {return 1;}return jieceng(N-1)*N;
}

这是阶乘的答案


http://chatgpt.dhexx.cn/article/aOk66yAC.shtml

相关文章

【算法4总结】第一章:基础

目录备份 第一章&#xff1a;基础 我认为这一章主要介绍的是如何使用工具。 一共五节&#xff0c;前两节主要是对 Java 语法的回顾&#xff0c;第三节则是三个数据结构&#xff0c;背包&#xff0c;队列和栈的API讲解。 而第四节是讲解的是如何分析算法。第五节则是针对具体…

SQL修改语句

如果我们要修改数据库中表的数据&#xff0c;这个时候我们就要使用到UPDATE语句。 UPDATE语句的基本语法是&#xff1a; UPDATE <表名> SET 字段1值1, 字段2值2, ... WHERE ...; 例如&#xff0c;我们想更新employees表id100的记录的last_name和salary这两个字段&…

【数据库】SQL语句之修改语句(INSERT,UPDATE,DELETE)

1.INSERT INSERT INTO <表名> (字段1, 字段2, ...) VALUES (值1, 值2, ...); 例如&#xff1a; 一次插入一个 INSERT INTO students (class_id, name, gender, score) VALUES (2, 小明, M, 80);一次插入多条 INSERT INTO students (class_id, name, gender, score) VA…

SQL Server修改数据

本篇主要讲解的是SQL Server 中修改数据的几种语句&#xff1a; INSERT语句INSERT INTO SELECT语句UPDATE语句DELETE语句 一&#xff1a;INSERT语句 INSERT语句向表中添加新行&#xff0c;以下是INSERT语句的最基本形式&#xff1a; 首先&#xff1a;table_name指定要插入的…

使用SQL语句修改表数据

使用SQL语句修改表数据 文章目录 使用SQL语句修改表数据利用INSERT语句输入数据利用UPDATE语句更新表数据利用DELETE语句删除表中数据利用Truncate Table语句删除表中数据 利用INSERT语句输入数据 INSERT语句的基本语法格式如下&#xff1a; 上述格式主要参数说明如下&#xf…

初探POC编写

文章目录 前言什么是POC什么是 ExpPOC注意事项尝试编写第一个POCpikachu sql盲注poc参考 前言 想锻炼一下编程能力&#xff0c;师兄说以后很重要的&#xff0c;最好学好一点 但是我又想学习安全相关的&#xff0c;那就来练练poc吧 什么是POC PoC(全称: Proof of Concept), …

POC_MeterSphere-RCE

MeterSphere-RCE 漏洞详情影响范围指纹- fingerPOC-YAML《飞致云MeterSphere开源测试平台远程代码执行漏洞》 漏洞详情 MeterSphere一站式开源持续测试平台存在的远程代码执行漏洞。由于自定义插件功能处存在缺陷,未经身份验证的攻击者可利用该漏洞在目标系统上远程执行任意…

【POC---概念验证】

文章目录 前言一、Proof of Concept是什么&#xff1f;验证内容 PoC测试工作准备前提PoC测试工作参与者PoC测试工作准备文档PoC测试工作第一阶段 工作启动第二阶段 产品宣讲及现场集中测试第三阶段 技术测评第四阶段 间歇性测试工作 第五阶段 商务验证第六阶段 背书归档、分析总…

POC_Jenkins

简介 Jenkins是一个开源软件项目,是基于Java开发的一种持续集成工具,用于监控持续重复的工作,旨在提供一个开放易用的软件平台,使软件项目可以进行持续集成,Jenkins用Java语言编写,可在Tomcat等流行的servlet容器中运行,也可独立运行。通常与版本管理工具(SCM)、构建工…

网络安全中的POC、EXP、Payload、ShellCode_网络安全payload是什么意思

什么是 POC、EXP、Payload&#xff1f; POC&#xff1a;概念证明&#xff0c;即概念验证&#xff08;英语&#xff1a;Proof of concept&#xff0c;简称POC&#xff09;是对某些想法的一个较短而不完整的实现&#xff0c;以证明其可行性&#xff0c;示范其原理&#xff0c;其…

Zendstudio 9.0.2 安装Aptana3 并且配置 jQuery

原文地址:http://my.oschina.net/feek/blog/64517 aptana-javascript-jquery.ruble文件夹下载地址: http://dl.dbank.com/c04bfgbchz 一直在用zenstudio9&#xff0c;有时候又需要用到jquery等插件辅助制作前台效果&#xff0c;想安装个Aptana3插件&#xff0c;但是查了好多网…

elfk

1. 2. ​​​​​​​ 3. 4. 5.

c/c++读写文件(c方法篇)

读写文件操作 C语言方法 参考博客&#xff1a;函数基本介绍&#xff1a; https://www.cnblogs.com/lidabo/p/6813354.html 自己写了个demo测试一下fopen、feek、fwrite、fread函数的使用&#xff0c;代码如下&#xff1a; void OperationFile_C() {FILE* fp NULL;fp fopen(…

EFLFK

目录 zookeeper概述 zookeeper 定义 Zookeeper工作机制 Zookeeper特点 Zookeeper数据结构 Zookeeper 应用场景 Zookeeper选举机制 第一次启动选举机制 非第一次启动选举机制 部署 Zookeeper 集群 准备 3 台服务器做 Zookeeper 集群 安装前准备 关闭防火墙 安装 J…

fseek函数c语言_使用示例的C语言中的fseek()函数

fseek函数c语言 C中的fseek()函数 (fseek() function in C) Prototype: 原型&#xff1a; int feek(FILE *stream, long int offset, int origin);Parameters: 参数&#xff1a; FILE *stream, long int offset, int originReturn type: int 返回类型&#xff1a; int Use o…

c语言feek函数读取中文出现乱码

c语言feek函数读取中文出现乱码 在文件操作的学习中,发现读取文件的中文时会出现乱码 当输入的文字改成英文时则不会出现乱码,于是猜想是否和中文与英文占用的字节有关系,实践得出结论,的确是字节搞的鬼,那么有趣了,如果恰好文件指针指向中文字节的一半时,这个指针指向…

vue element-ui自定义表头,动态添加表头,新增行、新增列、删除行、删除列

vue element-ui表格怎样自定义表头&#xff0c;动态添加表头&#xff0c;新增行、新增列、删除行、删除列 需求描述1.自定义表头&#xff0c;表头里插入输入框2.默认初始化几行几列占位3.新增行4.新增列5.右键点击行&#xff0c;进行删除行6.右键点击表头&#xff0c;进行删除列…

sql delete删除列_现有表操作中SQL DELETE列概述

sql delete删除列 In this article, we will explore the process of SQL Delete column from an existing table. We will also understand the impact of removing a column with defined constraints and objects on it. 在本文中,我们将探讨从现有表中删除SQL列的过程。 …

Notepad++快速删除列或者列位置增加相同内容

一、快速删除列(一列或者多列) 方法&#xff1a;鼠标选择范围的起始位置&#xff0c;按住AltShift&#xff0c;然后鼠标选择范围的结束位置 使用‘BackSpace’删除即可 二、快速增加列内容 方法&#xff1a;鼠标放在第一行某一列&#xff0c;按住AltShift&#xff0c;然后鼠…

poi移动列和删除列

Java poi 移动列 删除列 移动列删除列最后 移动列 从poi4.0.0开始&#xff0c;在sheet里面提供了一个移动列的api shiftColumns(int startColumn, int endColumn, final int n)&#xff0c; 移动开始列、结束列和移动列数。 需要注意的是&#xff0c; 移动到的列需要没有格式…