P5461 赦免战俘

P5461 赦免战俘

#include <iostream>
using namespace std;
#include <algorithm>
#include <vector>
#include <cmath>
void pardon(auto & matrix,int x,int y,int size){if(size == 1) return;int half = size / 2;for(int i =x;i < x + half;i++ ){for(int j = y; j < y + half;j++){matrix[i][j] = 0;}}pardon(matrix,x + half,y,half);pardon(matrix,x,y + half,half);pardon(matrix,x + half,y + half,half);
}
int main(){int n;cin>>n;int m = pow(2,n);//vector<vector<int>> matrix (m,vector(m,1));auto matrix = vector(m,vector(m,1));pardon(matrix,0,0,m);for(auto & line :matrix){for(auto & x:line){cout<<x<<" ";}cout<<endl;}
}

有些递归函数返回一个值(例如斐波那契数列),而有些递归函数只有 return 语句,通常用于标识递归结束。让我们深入探讨这个问题。

递归函数的两种常见模式

  1. 递归返回值:
    有些递归函数是用来计算和返回值的,比如斐波那契数列。每一次递归调用都会返回一个结果,这些结果会通过递归的方式汇聚起来,直到最终返回给调用者。

    例如斐波那契数列的递归:

    int fibonacci(int n) {if (n <= 1) return n;return fibonacci(n - 1) + fibonacci(n - 2);  // 返回计算的值
    }
    

    在这个例子中,每个递归调用都会计算一个值并将其返回。返回的结果被累加和传递,最终得到斐波那契数列的第 n 项。

  2. 递归没有返回值:
    另一种常见的递归方式是通过递归完成某些任务(如修改全局/外部变量、打印输出等),但不返回值。这些递归通常通过 return 来控制递归的结束,而不关心返回的具体数值。

    例如这个 releaseMomos 函数:

    void releaseMomos(int x, int y, int size) {if (size == 1) return;  // 递归的终止条件releaseMomos(x, y, size / 2);  // 子递归// 完成当前任务后,返回父级递归
    }
    

    在这种情况下,递归的目的是分解问题或控制任务流,不需要返回具体的值。通过每次递归来修改状态或完成操作,然后在结束条件处通过 return 跳出递归。


为什么有些递归没有返回值?

当递归的目的是 执行操作(如修改数组、改变全局状态、打印等)而非 计算并返回值 时,我们并不需要在递归中返回任何数据。这类递归通过改变外部状态或执行操作来完成任务。典型的例子包括:

  • 修改外部变量: 比如一个递归函数用于更新一个数组或矩阵的状态,每个递归调用修改某些元素,最终完成整个任务。
  • 打印输出: 递归可以用于按特定顺序打印树或图结构,返回值没有意义,只是控制递归的流向。
  • 树的遍历: 在树的遍历中,递归用于访问每个节点,执行操作(如修改节点值、计算路径和等),没有必要返回一个具体的值。

举例说明:

  1. 带返回值的递归(例如斐波那契数列):

    这种递归中,每个递归调用都计算并返回一个值,递归的结果会逐步传递到上一层。典型的计算任务,通过递归的返回值来组合最终的结果。

    int fibonacci(int n) {if (n <= 1) return n;  // 基础情况return fibonacci(n - 1) + fibonacci(n - 2);  // 返回结果
    }
    
  2. 不返回值的递归(例如矩阵分治):

    在这种递归中,返回值并不重要。递归更多的是“分解问题”,每层递归完成一个任务后返回给上一层,直到达到递归的终止条件。这类递归通过外部状态(如全局数组、输出等)来记录信息或进行操作。

    void releaseMomos(int x, int y, int size) {if (size == 1) return;  // 递归结束条件releaseMomos(x, y, size / 2);  // 分解为更小的任务// 完成当前任务
    }
    

    这里递归本身没有返回值,只有 return 作为递归结束的标识。递归过程通过改变外部状态、打印信息等来完成任务。


总结:

  • 返回值的递归 是用来计算某个值的,递归通过返回值来将计算结果传递回去(例如斐波那契数列)。
  • 无返回值的递归 主要用于执行任务(如修改外部状态、打印等),递归本身只是通过状态的改变或控制流程来完成任务,而不需要返回结果。

releaseMomos 这类递归中,它的目的是完成任务(例如矩阵的分治、状态的更新等),而非返回一个计算的结果,因此它只需要通过 return 来控制递归的结束,不需要返回值。

希望这个解释帮助你理解了为什么不同递归会有不同的返回机制。

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

GoTrackIt应用指南:共享单车时空轨迹可视化

GoTrackIt平台集成了对 Kepler.gl 可视化工具的部分功能进行了封装&#xff0c;通过引入 KeplerVis 类&#xff0c;显著简化了地理空间数据分析与展示的过程。利用这一类&#xff0c;开发者和数据分析师能够在网页端快速实现复杂地理数据的动态可视化&#xff0c;而无需深入掌握…

LeetCode 力扣 热题 100道(十五)搜索插入位置(C++)

给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 代码如下所示&#xff1a; class Solution { public:int searchIns…

JS中递归函数的理解及展开运算符在递归种的运用理解

<!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><title>递归函数</title> </head> <body> <script>const list ["你好", "吃饭了吗",["好",[[&qu…

vue中.sync修饰符的用法

一、什么是.sync修饰符 在Vue.js中&#xff0c;.sync 修饰符用于创建一个双向绑定的 prop。它使子组件能够更新父组件的 prop 值&#xff0c;实现父子组件之间的双向数据同步。具体来说&#xff0c;.sync 修饰符主要有以下几个功能&#xff1a; 简化双向绑定&#xff1a; 使用…

element Plus中 el-table表头宽度自适应,不换行

在工作中&#xff0c;使用el-table表格进行开发后&#xff0c;遇到了小屏幕显示器上显示表头文字会出现换行展示&#xff0c;比较影响美观&#xff0c;因此需要让表头的宽度变为不换行&#xff0c;且由内容自动撑开。 以下是作为工作记录&#xff0c;用于demo演示教程 先贴个…

rockit 学习、开发笔记(五)(VDEC)

前言 后面由于业务需求有rockit编解码的功能开发&#xff0c;这里我是第一次接触编解码&#xff0c;所以后续有些概念表述可能不太清楚&#xff0c;请各位多多包涵。 先来说一下解码模块的使用&#xff0c;rockit中的解码模块是VDEC&#xff0c;如果想要开发rockit的vdec可能…

unicloud微信小程序云端一体项目DEMO

最近应客户需求&#xff0c;做了一个产品展示的云开发小程序&#xff0c;从了解云开发到应用到实际项目的产品demo&#xff0c;希望大家能从中获取到对自己有用的东西。 说下心得体会吧&#xff0c;一般小项目用这种云开发确实会减少很多开发成本&#xff0c;人力成本&#xf…

图的创建和基础操作(数据结构实验作业)

上面是我的实验作业要求&#xff1a;&#xff08;看不到的同学&#xff0c;移步&#xff1a;https://gitee.com/young-lion/picture-bed/raw/master/202412051939715.png&#xff09; 下面的代码使用的是go语言&#xff1a; package mainimport ("fmt" )// 访问标记…

flex布局容易忽略的角色作用

目录 清除浮动 作用于行内元素 flex-basis宽度 案例一&#xff1a; 案例二&#xff1a; 案例三&#xff1a; flex-grow设置权重 案例一&#xff1a; 案例二&#xff1a; 简写flex-grow:1 0 auto; flex作为一维布局,行和列的使用&#xff0c;忽略的小角色&#xff0c;大…

javascript-svg-在圆环上拖动并选中区域

目录 问题描述解决思路代码结构 问题描述 假设我某个页面上使用了<svg>&#xff0c;其中包括一个<circle>。我希望实现的是&#xff1a;在circle上点击某个位置后&#xff0c;拖动&#xff0c;出现圆弧状阴影。实现效果为&#xff1a; 解决思路 要实现这个效果…

Android 使用 Canvas 和 Paint 实现圆形图片

学习笔记 效果展示: 全部代码: public class YuanActivity extends AppCompatActivity {private ActivityYuanBinding binding;Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);// 通过 DataBinding 获取布局文件binding …

python怎么将字母大写

Python中有三种将字母转换为大写的方法&#xff1a;upper()、capitalize()、title()。 下面通过实例给大家介绍具体用法&#xff1a; str "www.php.com" print(str.upper()) # 把所有字符中的小写字母转换成大写字母 print(str.lower()) # 把所有字…

鸿蒙Next星河版高级用例之网络请求和自适应布局以及响应式布局

目录&#xff1a; 1、发起网络请求的两种方式第一种使用httpRequest发送http的请求&#xff1a;1.1、在进行网络请求前&#xff0c;您需要在module.json5文件中申明网络访问权限1.2、GET 请求1.3、POST请求1.4、处理响应的结果第二种使用axios发送http的请求&#xff1a;1.1、在…

ClouderaManager 集群搭建

前提&#xff1a;服务器之前做过域名映射、免密登录 ClouderaManager 集群 1. 组件分布规划 服务器服务器h1zk、hdfs(dn)、yarn(nm)、spark、kafka、flumeh2hdfs(nn-standy)、yarn(rm-active)、sparkh3hdfs(nn-active)、yarn(rm-standy)、hive、sparkh4zk、hdfs(dn)、yarn(n…

如何获取谷歌新闻API密钥?

在信息获取和新闻传播领域&#xff0c;快速获取最新的新闻动态至关重要。谷歌新闻API为开发者提供了强大的工具&#xff0c;能够方便地集成全球各类新闻内容。通过使用该API&#xff0c;开发者可以实现对新闻的实时访问和管理&#xff0c;为用户提供丰富的信息服务。本文将指导…

IP 协议

IP协议 一、介绍1、IP协议2、IPv43、IPv6 二、主要功能三、协议格式1、示意图2、说明 四、网段划分1、介绍2、目的3、方法4、步骤 五、基于类别的IP地址分配方式1、示意图2、范围 六、CIDR1、介绍2、组成3、优点4、示意图 七、子网掩码1、介绍2、功能3、表示方法4、CIDR表示法5…

数据结构 (23)并查集与等价类划分

一、并查集 并查集&#xff08;Union-Find Set或Disjoint Set&#xff09;是一种数据结构&#xff0c;用于处理一些不相交集合&#xff08;disjoint sets&#xff09;的合并及查询问题。它通常表示为森林&#xff0c;并用数组来实现&#xff08;类似于二叉堆&#xff09;。在并…

Java 【数据结构】 哈希(Hash超详解)HashSetHashMap【神装】

登神长阶 第十神装 HashSet 第十一神装 HashMap 目录 &#x1f454;一.哈希 &#x1f9e5;1.概念 &#x1fa73;2.Object类的hashCode()方法: &#x1f45a;3.String类的哈希码: &#x1f460;4.注意事项: &#x1f3b7;二.哈希桶 &#x1fa97;1.哈希桶原理 &#x…

lyapunov指数的绘制

有如下方程&#xff1a; %% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)绘制其对应的lyapunov指数。 MATLAB实现方式&#xff1a; clc; clearvars; close all;%% 方程式 % x(n1)1y(n)-a*x(n)^2 % y(n1)b*x(n)%% 代码 N 1000; a (0:0.001:1.4); b 0.3; na length(a…

LearnOpenGL学习(高级OpenGL -- 深度测试,模板测试,)

深度测试 深度缓冲用来防止被阻挡的面渲染到其他面的前面&#xff0c;深度缓冲就像颜色缓冲&#xff0c;在每个片段中储存了信息&#xff0c; 当深度测试(Depth Testing)被启用的时候&#xff0c;OpenGL会将一个片段的深度值与深度缓冲的内容进行对比。OpenGL会执行一个深度测…