第三站:函数(第三幕)递归训练

news2025/7/7 5:15:49

目录

一、编写一个函数实现n的k次方,使用递归实现。(k为整数)

二、写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

三、编写一个函数 reverse_string(char * string)(递归实现)

总结


一、编写一个函数实现n的k次方,使用递归实现。(k为整数)

 这道题我们其实就很容易联想到库函数中就有一个pow函数,这道题的本质就是想让我们模拟这个pow函数。

那么该如何模拟呢?我们的次方无非就是0,大于0,小于三种情况,等于0最简单,因为任何数的0次方都等于1,大于0呢?那就相当于n*n的k-1次方。小于零的话,那不就是大于0的倒数吗,我们将k改为-k,然后取倒数即可,也就是说,他的递推方程应该这样写

 那有了递推函数,写出答案就轻而易举,代码如下

#include<stdio.h>
double Pow(int n, int k)
{
	if (k == 0)
	{
		return 1;
	}
	else if (k > 0)
	{
		return  n * Pow(n, k - 1);
	}
	else
	{
		return 1.0 / Pow(n, -k);
	}
}
int main()
{
	int n;
	int k;
	scanf("%d %d", &n, &k);
	double ret = Pow(n, k);
	printf("%lf", ret);
	return 0;
}

写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和

例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19

输入:1729,输出:19

这道题,不知道大家有没有感觉和上一篇文章种分解1234的题目很像,没错,这道题确实思路基本一致。我们来写一下递归函数吧

 那么代码实现如下

#include<stdio.h>
int DigitSum(int n)
{
	if (n > 9)
	{
		return DigitSum(n / 10) + n % 10;
	}
	else
	{
		return n;
	}
}
int main()
{
	int n;
	scanf("%d", &n);
	int ret = DigitSum(n);
	printf("%d", ret);
	return 0;
}

三、编写一个函数 reverse_string(char * string)(递归实现)

实现:将参数字符串中的字符反向排列,不是逆序打印。

要求:不能使用C函数库中的字符串操作函数。

比如:char arr[] = "abcdef"   逆序之后数组的内容变成:fedcba

这道题很多人看到后肯定是一脸懵了。没有什么思路,但是不要怕。我们先一步一步看。递归我们可能一开始想不到,但是循环的方式我们应该还是可以想到的。首先看下图,这是我们的字符串

 我们想要进行逆序,那我们可不可以,利用一下之前二分查找时候,我们使用了左下标和右下标的方法,我们将第一个和最后一共进行交换,然后第二个和倒数第二个进行交换,这样一直交换下去,就可以解决了,而循环结束的条件也和二分查找那个一致,左下标小于等于右下标即可。那我们简单的实现一下吧。

#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
void reverse_string(char arr[])
{
	int left = 0;
	int right = my_strlen(arr) - 1;
	while (left <= right)
	{
		int tmp = 0;
		tmp = arr[left];
		arr[left] = arr[right];
		arr[right] = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

上面这段代码中,我们的参数是用一个数组,可是题目要求的是指针,那该如何解决呢,其实数组传参传的就是首元素地址,改成指针当然没问题,但是下面的使用数组的方式进行交换有人就感觉很乱了, 其实这里采用数组的方式也是可以的,我们后期会着重讲解,这里我们可以把他改写成指针的方法。代码如下所示

#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
void reverse_string(char* arr)
{
	int left = 0;
	int right = my_strlen(arr) - 1;
	while (left <= right)
	{
		int tmp = 0;
		tmp = *(arr+left);
		*(arr+left) = *(arr+right);
		*(arr+right) = tmp;
		left++;
		right--;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

这样确实可以使用使用循环的方式解决了问题,可是这还不够,因为我们的需求是采用递归。递归该如何想呢?

 上图是我们需要交换的字符串,我们可以这样想,我们先交换a和f,然后递推调用交换bcde这个段字符串,然后继续交换b和e,然后递推调用交换cd,然后交换c和d,递推调用空字符串,遇到空字符串,就返回。这样想的话,似乎思路已经出来了。我们画一下函数公式吧。

 注意这里的只是为了方便理解所写出的一个公式,可能并不是很严谨,这是一个伪代码。但是根据这个我们已经可以写出我们的代码了,代码实现如下

#include<stdio.h>
int my_strlen(char* str)
{
	int count = 0;
	while (*str != '\0')
	{
		str++;
		count++;
	}
	return count;
}
void reverse_string(char* arr)
{
	int right= my_strlen(arr) - 1;
	if (*arr != '\0')
	{
		char tmp;
		tmp = *arr;
		*arr = *(arr + right);
		*(arr+right) = '\0';
		reverse_string(arr + 1);
		*(arr + right) = tmp;
	}
}
int main()
{
	char arr[] = "abcdef";
	reverse_string(arr);
	printf("%s", arr);
	return 0;
}

这就是我们的代码,唯一需要注意的一个坑就是,交换后,右边的得先变为\0,方便递归调用这个新字符串,等这个递归结束后,再把我们延迟交换的这个字符给补上即可


总结

本节课主要讲解了三道经典的例题,其中第三题需要仔细理解一下。

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

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

相关文章

WebDAV之葫芦儿·派盘+墨阅

墨阅 支持webdav方式连接葫芦儿派盘。 是一款专注于帮助用户离线缓存网页文档图书漫画的免费工具APP。您可以利用墨阅收集来自互联网网站平台的公开文章,图片,漫画等,可以对网页样式进行调整,支持自定义动作,批量离线等功能方便用户日常离线。目前支持小说,markdown,图…

公众号搜题系统

公众号搜题系统 本平台优点&#xff1a; 多题库查题、独立后台、响应速度快、全网平台可查、功能最全&#xff01; 1.想要给自己的公众号获得查题接口&#xff0c;只需要两步&#xff01; 2.题库&#xff1a; 查题校园题库&#xff1a;查题校园题库后台&#xff08;点击跳转…

语义分割之RTFormer介绍

语义分割之RTFormer介绍 论文链接&#xff1a;https://arxiv.org/abs/2210.07124 代码地址&#xff1a;https://github.com/PaddlePaddle/PaddleSeg ViT以来&#xff0c;Transformer作为特征提取器在语义分割领域证明了自己&#xff0c;但是由于Transformer的核心 muti-self-…

苹果电脑提高工作效率alfred 5中文

Mac电脑上哪个效率工具好用呢&#xff1f;alfred 5是最强大的效率启动工具之一&#xff0c;丰富的插件资源、简单的上手成本&#xff0c;会是你提高 Mac 使用效率的得力助手。可通过热键&#xff0c;关键字&#xff0c;文本扩展等提高您的效率。搜索您的Mac和网络&#xff0c;并…

Sprint产品待办列表的优先级要怎么排?

在梳理产品待办事项列表的过程中&#xff0c;产品负责人需要先做优先级排列&#xff0c;保证我们在一定的时间盒内能够交付需要优先级最高、最具价值的用户故事。 那这个用户故事的优先级要怎么排列&#xff0c;我们怎样选择用户故事的实现顺序&#xff1f; 有一个实践可以推…

力扣(LeetCode)816. 模糊坐标(C++)

模拟 一次遍历 sss &#xff0c;尝试对遍历到的位置进行分割。对分割点左右字符串 ltltlt , rtrtrt 分别构造子串。 构造子串的规则: 整数不以 000 开头&#xff0c;(特例)单独的 000 可以作为整数。小数不以 000 结尾。小数的整数位是 000 &#xff0c;则整数位不能组成新数…

怎么给PDF添加页面?推荐三个PDF如何插入页面小妙招

在我们生活中&#xff0c;平时接触PDF文件可能没有接触Word文件那么的多。像处理PDF文件这种问题上并没有Word文件那么的容易&#xff0c;毕竟PDF它不易进行内容编辑。这时候如果有小伙伴需要对PDF文件进行修改或者进行插入页面&#xff0c;但是PDF文件是无法直接进行修改的。那…

做期货的阶段(做期货的几个阶段)

如何自己做好期货 学习交易大致有三阶段&#xff1a;直观直觉阶段&#xff0c;看到涨就做多&#xff0c;看到跌就做空&#xff0c;结果半赢半输&#xff1b;学习积累的阶段&#xff0c;看到涨跌不觉涨跌&#xff0c;想得很多&#xff0c;结果赢少赔多&#xff1b;领悟后再次直…

软件架构师考试的真实感受

近1个半月&#xff0c;因准备了软件架构师的考试&#xff0c;停了BLOG&#xff0c;今天想写点东西作为阶段性的沉淀。 节奏紧 和软设比起来&#xff0c;最直观的感受就是节奏紧&#xff0c;软设上午通常能够提前一个小时考完&#xff0c;加上下午2点才开考&#xff0c;中间有…

Java UML 类图

继承 继承&#xff1a;重用父类的某些功能 缺点&#xff1a;强耦合 耦合&#xff1a;修改一方&#xff0c;会影响另一方 应用&#xff1a;是否需要“向上转型” 接口 行为的抽象、可跨越不同的类 不包含实现实现类需完全实现可实现多个接口 是一种“自顶向下”的设计&…

C++多态(1)

目录1. 多态的概念2. 多态的定义和实现2.1 多态的构成条件2.1.1 重写2.2.2 指针或者引用2.2 虚函数重写的两个例外2.3 多态里的一个不规范的地方2.4 重载、重写&#xff08;覆盖&#xff09;、隐藏&#xff08;重定义&#xff09;的对比3. C11 override 和 final1. 多态的概念 …

QSS编辑器QssEditor之三:Ribbon控件与换肤

一.Ribbon控件 Ribbon控件即Office样式UI,Ribbon控件有许多开源实现,例如:Qt优秀开源项目之三:SARibbon SARibbon功能强大,但以学习为目的的话,我们可以自己去实现一个简单的。基本思路是自定义QTabWidget,然后通过QSS调整样式。 如上图所示,我们可以实现一个类QHRi…

IP数据报首部字段、TCP报文段首部字段

文章目录 IP数据报首部字段IP数据报格式TCP报文段首部字段IP数据报首部字段 首部字段功能1.版本是IPv4还是IPv62.首部长度IP数据报首部的长度3.服务类型4.总长度IP数据报的总长度。若总长度>该网段的MTU,则需要分片。分片后IP数据报的总长度必然发生改变。5.标识保证IP分组…

C++--模板

目录 泛型编程 函数模板 函数模板概念 函数模板格式 函数模板的原理 函数模板的实例化 模板参数的匹配原则 类模板 类模板的定义格式 类模板的实例化 非类型模板参数 模板的特化 概念 函数模板特化 类模板特化 泛型编程 不再是针对某种类型&#xff0c;而是能适…

[python]用flask框架搭建微信公众号的后台

用flask框架搭建微信公众号的后台 最近用python写了点爬虫&#xff0c;为了要让爬取的数据能够随时显示在我眼前&#xff0c;并实时根据我的指令返回数据。于是采用微信公众号做这个显示窗口&#xff0c;既能发送指令也能显示简单的相关数据。 准备工具 python3.x环境 pycharm…

vue3与vue2的不同内容

一、main.js入口文件的不同 // 引入的不再是构造函数&#xff0c;引入了一个名为creacteApp的工厂函数 import { createApp } from vue import ./style.css import App from ./App.vue // 创建应用示例对象--->app const app createApp(App) //把组件APP挂载到#app节点上 …

疫情可视化(后续)

前言 这是疫情可视化最开始的文章&#xff0c;有需要了解的可前往查看&#xff1a;https://blog.csdn.net/xi1213/article/details/126824752。 本来说有时间就把这个项目完结了的&#xff0c;结果后面一直有事拖着&#xff0c;直到现在十一月份了才搞完。老样子&#xff0c;先…

拓端tecdat|R语言代做时间序列和ARIMA模型预测拖拉机销售的制造案例研究

全文链接&#xff1a;http://tecdat.cn/?p5421 原文出处&#xff1a;拓端数据部落公众号 相关视频&#xff1a;在Python和R语言中建立EWMA&#xff0c;ARIMA模型预测时间序列 本文是我们通过时间序列和ARIMA模型预测拖拉机销售的制造案例研究示例的延续。您可以在以下链接中找…

2023第二届中国绿色包装创新峰会|低碳与数字化时代的绿色包装

峰会背景 随着中国市场包装使用量的激增&#xff0c;中国已成为全球最大的包装市场&#xff0c;环境中废弃包装所导致的生态负担也同步加剧。但随着消费者可持续发展意识的显著增强&#xff0c;企业环保意识的提升以及国家强制性环保政策的出台&#xff0c;包装可持续发展变得…

初识C++(三)

概述&#xff1a;本篇主要讲述“引用“ 分别就引用的概念、引用特性、引用的应用场景、以及常引用展开描述。后续会补充引用的底层原理&#xff0c;敬请期待。 目录 什么是引用&#xff1f; 引用的三个特性 引用的应用 引用做参数 引用做返回值 常引用 总结 什么是引用&a…