007——递归(树的前置知识点)

news2024/11/14 20:31:43

目录

创建副本

递归

直接调用

间接调用

递归的具体流程又是什么样子的?

递归函数的组成:

递归可以用来解决什么问题?

例子1:求和问题

例子2:斐波那契数列

补充:


说到递归,我们可以简单理解成某个函数直接或间接的调用自身递,意思是递进;归,意思是回归。而函数调用的本质是创建副本。我们用下面的图解来说明函数的调用为什么是创建副本。

创建副本

在上图的主函数中,调用了fun函数,那么程序在执行到fun(6);语句的时候会创建副本,并执行fun副本中的内容,在执行完fun副本的代码后,便会返回main方法,继续执行下面的代码。

 继续说到递归,是某个函数直接间接的调用自身

递归

直接调用

直接调用的例子如下:

#include<stdio.h>
#include<stdlib.h>
void fun(int a) {
	fun(a+10);//直接调用
}
int main() {
	fun(4);
}

间接调用

间接调用的例子如下:

#include<stdio.h>
#include<stdlib.h>
void elfun(int b) {
	fun(b + 5);//间接调用
}
void fun(int a) {
	elfun(a+10);
}
int main() {
	fun(4);
}

递归的具体流程又是什么样子的?

我们那下面这个有限递归的代码举例

#include<stdio.h>
#include<stdlib.h>
int x = 0;
void fun(int a) {
	printf("%d\n", a);
	x++;
	while(x<3)
		fun(a+10);
	printf("***********\n");
}
int main() {
	fun(4);
}

运行结果:

该代码的运行流程图是这样的

程序从main函数开始运行,当运行到fun函数时,自动创建副本,代码执行立刻从main函数跳转到副本1,执行副本1函数,执行副本1函数的时候又碰见调用函数fun,接着创建副本2函数并跳转,直到不能跳转为止,在上述代码中程序一共创建了3个副本,当最后一个副本也就是副本3执行完以后,程序运行跳转到上一个副本2,继续执行副本2没有执行完的代码,如此直到第一个副本执行完毕,程序继续执行main函数下面没有执行完的代码。

递归函数的组成:

①递归出口/终止条件/边界条件:停止递归调用的条件,避免死循环/爆内存

②递归体

递归可以用来解决什么问题?

如果一个问题可以分成若干个小问题,并且这些小问题的解决思路和大问题一样

例子1:求和问题

(注意,我们在写递归函数的时候,不要想太多后面它是怎么调用的,要不然有时候容易绕进去,我们只需要搞清楚递归函数的功能(可以看看一次递归函数调用的结果是什么来判断功能是否正确)即可,不要深想)

代码:


#include<stdio.h>
#include<stdlib.h>
int add(int a) {
	if (a == 1) {
		return 1;
	}
	int ans;
	ans = a + add(a - 1);
	return ans;
}
int main() {
	int n;
	scanf_s("%d", &n);
	int sum = 0;
	sum = add(n);
	printf("1到%d的整数和为%d", n, sum);
}

运行结果: 

流程图

例子2:斐波那契数列


#include<stdio.h>
#include<stdlib.h>
int add(int a) {
	if (a == 1||a==2) {
		return 1;
	}
	int ans;
	ans = add(a - 2) + add(a - 1);
	return ans;
}
int main() {
	int n;
	scanf_s("%d", &n);
	int sum = 0;
	sum = add(n);
	printf("第%d项的斐波那契数列为%d", n, sum);
}

补充:

1.递归只是书写代码的一种格式/方式

2.任何递归代码都可以转化成非递归形式,大部分情况下要借用栈来实现,而一些简单的代码,可以通过循环或者其他形式来实现

3.工程开发中不要用递归,因为递归出口很容易出现问题

4.尾递归,是一种编译层面的优化,是当递归语句在结尾的时候,直接创建一个副本不断覆盖,而不会占用其他空间

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

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

相关文章

Spring Boot实用小技巧5 - 第527篇

《国内最全的Spring Boot系列之一》 《国内最全的Spring Boot系列之二》 《国内最全的Spring Boot系列之三》 《国内最全的Spring Boot系列之四》 《国内最全的Spring Boot系列之五》 《国内最全的Spring Boot系列之六》 《国内最全的Spring Boot系列之七》 SpringBoot …

10KV并网分布式光伏电力监控解决方案

一、分布式光伏并网要求 Q/GDW1480-2015 《分布式电源接入电网技术规定》&#xff1a;分布式电源并网电压等级可根据各并网点装机容量进行初步选择&#xff0c;推荐如下&#xff1a; 8kW 及以下可接入220V&#xff1b; 8kW~400kW可接入380V&#xff1b; 400kW~6MW可接入10k…

MySQL篇(锁机制 基本介绍、全局锁\表级锁\行锁、悲观锁\乐观锁)

目录 讲解一&#xff1a;基本介绍 一、简介 二、MySQL中的锁 1. 锁粒度分类&#xff08;三类&#xff09; 讲解二&#xff1a;全局锁\表级锁\行锁 一、全局锁 1. 简介 2. 不加全局锁的问题 3. 加全局锁的好处 4. 操作 加全局锁 数据备份 释放锁 5. 特点 二、表级…

计算机毕业设计 基于Flask+Vue的博客系统 Python毕业设计 前后端分离 附源码 讲解 文档

&#x1f34a;作者&#xff1a;计算机编程-吉哥 &#x1f34a;简介&#xff1a;专业从事JavaWeb程序开发&#xff0c;微信小程序开发&#xff0c;定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事&#xff0c;生活就是快乐的。 &#x1f34a;心愿&#xff1a;点…

稀土抗菌剂马桶盖,让家庭清洁更上一层楼

稀土元素&#xff0c;作为现代工业中的“维生素”&#xff0c;在抗菌领域的表现尤为突出。稀土抗菌剂是一种通过阻碍细菌代谢活动&#xff0c;抑制细菌繁殖的高效抗菌材料。与普通抗菌技术相比&#xff0c;稀土抗菌剂具有更强的持久性和安全性&#xff0c;能够长期有效地抑制细…

Kolors模型部署指南

一、模型介绍 Kolors 是快手 Kolors 团队基于潜在扩散的大规模文本转图片生成模型。经过数十亿个文本-图片对的训练&#xff0c;Kolors 在视觉质量、复杂语义准确性和中英文文本渲染方面均比开源和闭源模型具有显著优势。此外&#xff0c;Kolors 支持中英文输入&#xff0c;在…

GPT-4o能玩《黑神话》!精英怪胜率超人类,无强化学习纯大模型方案

AI玩黑神话&#xff0c;第一个精英怪牯护院轻松拿捏啊。 有方向感&#xff0c;视角也没有问题。 躲闪劈棍很丝滑。 甚至在打鸦香客和牯护院时&#xff0c;AI的胜率已经超过人类。 而且是完全使用大模型玩&#xff0c;没有使用强化学习。 阿里巴巴的研究人员们提出了一个新型V…

派可数据:解锁数据潜力,驱动业务价值新增长

前 言 当前&#xff0c;企业数字化转型经过初始探索阶段&#xff0c;各行各业进入高速发展百花齐放的创新应用新阶段。创新应用阶段的核心是企业应用先进的数字技术和工具&#xff0c;对企业多年在全领域积累的各类数据&#xff0c;包括财务、业务、生产、设计、设备、工艺等结…

Python编码系列—Python模板方法模式:定义算法骨架,让子类实现细节

&#x1f31f;&#x1f31f; 欢迎来到我的技术小筑&#xff0c;一个专为技术探索者打造的交流空间。在这里&#xff0c;我们不仅分享代码的智慧&#xff0c;还探讨技术的深度与广度。无论您是资深开发者还是技术新手&#xff0c;这里都有一片属于您的天空。让我们在知识的海洋中…

STM32F407单片机编程入门(十六) DMA详解及ADC-DMA方式采集含源码

文章目录 一.概要二.STM32F407VET6单片机DMA外设特点三.STM32F407单片机DMA内部结构图四.DMA各通道请求五.STM32F407VET6单片机ADC-DMA采集例程六.工程源代码下载七.小结 一.概要 基本概念&#xff1a; DMA是Direct Memory Access的首字母缩写,是一种完全由硬件执行数据交换的…

RK3568教学实验箱_操作教程:5-15 直流电机控制实验

一、产品简介 TL3568-PlusTEB人工智能实验箱 国产高性能处理器 64 位 4 核低功耗 2.0 GHz超高主频 1T 超高算力 NPU 兼容鸿蒙等国产操作系统 二、实验目的 1、熟悉Qt程序的开发流程&#xff1b; 2、掌握Qt Creator的基础开发使用&#xff1b; 3、通过编写Qt程序实现直流…

骨架行为识别-论文复现(论文复现)

骨架行为识别-论文复现&#xff08;论文复现&#xff09; 本文所涉及所有资源均在传知代码平台可获取 序言 骨架行为识别的定义 骨架行为识别是指通过分析人体骨架的运动轨迹和姿态&#xff0c;来识别和理解人体的行为动作。它是计算机视觉和模式识别领域的一个重要研究方向&a…

力扣上刷题之C语言实现-Days1

一. 简介 本文记录一下力扣的逻辑题。主要是数组方面的&#xff0c;使用 C语言实现。 二. 涉及数组的 C语言逻辑题 1. 两数之和 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target的那 两个 整数&#xff0c;并返回它们的…

C++笔试强训15、16、17

文章目录 笔试强训15一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训16一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训17一、选择题1-5题6-10题 二、编程题题目一题目二 笔试强训15 一、选择题 1-5题 共有派生下&#xff0c;派生类的成员函数只能访问基类的…

大模型训练不难,三步即可实现

前言 初步认识了大模型长什么样了&#xff0c;接下来一起来看看如何训练出一个大模型。 训练方式&#xff0c;这里主要参考OpenAI发表的关于InstructGPT的相关训练步骤&#xff0c;主流的大模型训练基本形式大多也是类似的&#xff1a; 1、预训练&#xff08;Pretraining&a…

安卓13设置动态修改设置显示版本号 版本号增加信息显示 android13增加序列号

总纲 android13 rom 开发总纲说明 文章目录 1.前言2.问题分析3.代码分析4.代码修改5.编译6.彩蛋1.前言 设置 =》关于平板电脑 =》版本号 在这里显示了系统的一些信息,但是这里面的信息并不包含序列号之类的信息,我们修改下系统设置,在这里增加上相关的序列号。 2.问题分析…

C语言 使用scanf函数时出现错误代码C4996

文章目录 错误样式解决方法方法一&#xff1a;使用安全的函数替代方法二&#xff1a;禁用警告方法三&#xff1a;检查并修改编译器设置 错误样式 C4996 ‘scanf’: This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _C…

《算法岗面试宝典》正式发布

大家好&#xff0c;历时半年完善&#xff0c;《算法岗面试宝典》 终于可以跟大家见面了。 最近 ChatGPT 爆火&#xff0c;推动了技术圈对大模型算法场景落地的热情&#xff0c;就业市场招聘人数越来越多&#xff0c;算法岗一跃成为竞争难度第一的岗位。 岗位方向 从细分方向…

K8s Calico替换为Cilium,以及安装Cilium过程

一、删除Calico kubectl delete daemonset calico-node -n kube-systemkubectl delete deployment calico-kube-controllers -n kube-system kubectl delete ds kube-flannel-ds -n kube-system kubectl delete cm calico-config -n kube-system kubectl delete secret calico…

YOLOv5训练COCO2017数据集

网上没找到适合新手小白的教程,看了些教程,但还是没法解决自己遇到的问题。记录下自己的过程,希望能提供点帮助。 默认已经部署好了yolov5。 安装部署yolov5可参考以下: ubuntu20.04配置YOLOV5(非虚拟机)_ubuntu系统实现yolov5没有显卡-CSDN博客 目录 一、数据集下载…