使用递归函数求解字符串的逆置问题
一、递归函数概述
在使用面向过程的编程语言进行程序编写的过程中,一般是按照结构化的编程思想、模块化的程序设计方法来进行程序的编写和代码的组织的。我们熟悉的C语言就是这样一类程序设计语言,它通常以函数为单位进行程序的模块化组织,C源程序就是由一个主函数和若干非主函数构成的。计算机在执行C程序时,是按照顺序从主函数main()开始执行,如果遇到调用其他函数的情况,则主函数暂停执行,转而执行相应的函数,该函数执行完毕之后,返回主函数,主函数继续执行,这称为函数的调用。不仅主函数可以调用其他函数,各个函数之间也是可以相互调用的,如果一个函数自己调用自己,我们称之为函数的递归调用。在某些特殊问题的求解中,使用递归函数有时候会有非常高的效率。(汉诺塔 问题也是递归算法的一个典型应用)(更好的阅读体验,请访问程序员在旅途)
递归(Recursion)在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法,其核心思想是分治策略。 递归算法适合解决以下三类问题:
- 数据的定义是按递归定义的。如Fibonacci函数。
- 问题解法按递归算法实现。如Hanoi问题。
- 数据的结构形式是按递归定义的。如二叉树、广义表等。
二、字符串逆置例题求解
2.1 题目描述
编写一个函数把字符串逆置(如字符串"abcde"变成"edcba")。
2.2 分析求解
将字符串逆置,可以将第一个字符串和最后一个字符串交换,再将剩下的字符串逆置,剩下的字符串长度就在原来的长度上减2,规模以此缩小,剩下的字符串逆置方法和第一次一样,如果字符串长度≤1,则递归条件结束。程序如下:
#include<stdio.h>
//start,end为字符串开始和结束的下标
void convert_str(char *str, int start, int end){char ch;if((end - start) < 1){ // <1说明字符串 只有一个字符,无无需交换,递归结束条件return ; }else{ch = str[start];str[start] = str[end];str[end] = ch;convert_str(str,start+1,end-1); //递归调用该函数,将剩下的字符串进行交换}
}
int main(){char x[] = "abcdefgh";convert_str(x,0,7);printf("字符串逆置后为: %s \n", x);return 0;
}
三、总结
1)递归的精髓在于如何把规模大的、较难解决的问题变成规模较小的、易解决的同一问题,规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。此外,还得要注意递归的终止条件,也就是递归的出口,出口条件设置错误的话,程序会无法终止,从而导致程序的崩溃。
2)递归的实现得益于栈这种数据结构,函数的每一次调用,都会使用栈来保存函数的参数、局部变量、返回地址等数据,因此,在使用递归的时候,一定要考虑递归的深度问题,如果过深,会容易造成栈溢出,导致问题求解失败。
使用递归函数求解字符串的逆置问题相关推荐
- 长理2017 f0803 求和:s=1-(1/2)+(1/3)-(1/4).........+(1/n),编写函数fun(char*s),实现字符串的逆置编写程序从基类派生圆柱,设计(均为可运行代码)
求和:s=1-(1/2)+(1/3)-(1/4).........+(1/n), #include <stdio.h>int main() {int n,i;double s=1.0;sc ...
- C语言中 递归实现字符串逆置
递归图解: 每次递归时,都会创建一个字符变量C来保存字符串首位元素, 然后将字符串末尾元素赋给首位 同时字符串的起始位置都会向后推移一位,而结尾位置都会向前推移一位, 而在递归完成后,会将C中保存的字 ...
- 逆序字符串 和 字符串的逆序输出 的区别~
今天我们讲解字符串的逆序和逆序输出,并且通过一个综合题型来加深印象和练手! 超佳出品 文章目录 前言 一.逆序字符串,字符串的逆序输出是什么? 二.实例讲解 1.字符串的逆序输出 2.逆序字符串 总结 ...
- C语言之字符串探究(十):递归逆置字符串
相关博文:C++之char和string字符串类探究 相关博文:C语言之数组探究(一):定义.大小.初始化.访问和三要素 相关博文:C语言之字符串探究(一):字符串与字符数组 相关博文:C语言之字符串 ...
- 怎么把i am a student逆置成student a am i?面试题逆置字符串讲解
逆置字符串 一.题目描述 二.解题思路 三.完整代码 四.运行结果 一.题目描述 字符串逆置,如 "I am a student" 逆置为 "student a am I ...
- 55-将单链表原地逆置(三种方法)
方法1:用三个指针实现单链表(有头结点)的逆置 void Reverse(HeadList *head) {if(head==NULL||head->next==NULL||head->n ...
- C语言编程>第二十一周 ② 请补充main 函数,该函数的功能是:把一维数组中的元素逆置,结果仍然保存在原数组中。
例题:请补充main 函数,该函数的功能是:把一维数组中的元素逆置,结果仍然保存在原数组中. 注意:仅在横线上填写所需的若干表达式或语句,请勿改动函数中的其它任何内容. 代码如下: #include& ...
- 循环链表构建及解决约瑟夫环、逢七过、链表逆置问题
文章目录 循环链表构建 测试 约瑟夫环 逢七过 链表逆置 循环链表构建 循环链表与链表区别就在于尾指针不再指向null而是指向头指针,形成环. 接口定义: package p1.接口;import j ...
- 链表创建 删除 插入 逆置 打印 释放内存
#include <stdio.h> #include <stdlib.h> #include <string.h>//定义类型 typedef struct St ...
最新文章
- 链客区块链技术问答社区
- 百度SLG拿下前锤子科技CTO钱晨,还要合并小鱼在家? | 极客头条
- 张一鸣的微博世界-组织篇
- HTTP协议03-http特点及请求方式
- EntityFramework Core解决并发详解
- 【编程题】简单的四则运算
- Design Pattern - Service Locator Pattern--转载
- 吸收和实践的同时推进
- 数据库入门开发案例,真的是入门级别的!!看了不后悔。
- 【linux】Grok Debugger本地安装过程
- 对于文章的字母、单词、短语,(无用词表)的检索Java代码实现
- 【shell 脚本】删除/var/log 下的日志
- 员工申请加薪无望辞职,老板:不知感恩
- 移动办公系统现状分析
- WeChat for Linux
- Kademlia详解 (转贴NeoRagex2002)
- 奇思妙想,动手 DIY 你的浏览器主页
- CF1367C - Social Distance
- 苏州整车环境试验仓试验
- Electron flash插件
热门文章
- [转]Windows关机过程分析与快速关机
- 关于在ItemAdding时获取“用户和用户组”这个栏的值
- createEventObject 与 createEvent EDIT WATCH
- 基于lucene语法的实时文本搜索与匹配--Tripod
- 【DFS + Backtracking】LeetCode 79. Word Search
- 对称矩阵、Hermite矩阵、正交矩阵、酉矩阵、奇异矩阵、正规矩阵、幂等矩阵、合同矩阵、正定矩阵...
- 使用JavaScript判断用户是否为手机设备
- 关于Vector,map等迭代器问题
- 1,机器学习应用概述
- Java并发编程之volatile关键字