【数据结构和算法笔记】递归详解(附题)
一个递归模型由递归出口(3)和递归体(2)组成
递归转为非递归:
任何能正确执行的递归算法都能转换成功能等价的非递归算法
●尾递归算法可以通过循环或者迭代的方式转换为等价的非递归算法
●不是尾递归的复杂算法可以通过理解递归调用的基础上可以用栈来模拟递归执行过程,从而将其转换为等价的非递归算法。
递归设计:
汉诺塔问题:
已知A【0.....n-1】为整数数组,设计一个递归算法求这n个元素的平均值
avg(A,i)=A[0] 当 i=0 时
avg(A ,i)=(avg(A,i-1)*i+A[i])/(i+1)
float avg(int A[],int i)
{if(i==0){return(A[0]);}elsereturn ((avg(A,i-1)*i+A[i])/(i+1));}
设计一个算法求正整数n的位数
fun(n)=1 , 当n<10时
fun(n)=fun(n/10)+1 当n>=10时
int fun(int n)
{if(n<10){return 1;}else {return fun(n/10)+1;}
}
设计一个递归算法,将输入的数字逆置输出
void f(int m)
{if(m<10){cout<<m;return;}cout<<m%10;f(m/10);return;}
设计一个递归算法,利用顺序串的基本运算求串s的逆串
思路:对应s=“s1s2....sn”的串,假设s2~sn已经逆序,只需要把s1放在s2~sn逆序后的结尾即可
string f(string s)
{string res;if(s.size()==1){return s;}else{string s1=s.substr(1);return f(s1)+s[0];}
}
设有一个不带头结点的单链表L,设计两个递归算法,traverse(L)正向输出单链表L的所有节点值,traverseR(L)反向输出单链表L 的所有节点值
思路:当L为空时,返回
正向:print(L)+f(L->next)
反向:f(L->next)+print(L)
void traverse(LinkNode *L)
{if(L==NULL)return;cout<<L->data<<" ";traverse(L->next);
}
void traverseR(LinkNode *L)
{if(L==NULL)return;traverseR(L->next);cout<<L->data;
}
设有一个不带表头结点的单链表L,设计两个递归算法,del(L,x)删除单链表中第一个值为x的结点,delall(L,x)删除单链表中所有值为x的节点
思路:当链表为空,返会假
删除第一个x:
如果第一个数是x,删除后返回
删除L->next以后的数
删除所有x:
如果L->data=x,删除L,返回
删除L->next以后的数
void del(LinkNode *&L,int x)
{LinkNode *t;if(L==NULL)return;if(L->data==x){t=L;L=L->next;free(t);}del(L->next,x);
}
void delall(LinkNode *&L,int x)
{LinkNode *t;if(L==NULL)return;if(L->data==x){t=L;L=L->next;free(t);}delall(L->next,x);
}
设有一个不带头结点的单链表L,设计两个递归算法,maxnode(L)返回单链表中最大节点值,minnode(L)返回单链表中最小节点值
如果L只有1个,返回L->data
L->data与maxnode(L->next)比较,返回较大的值
L->data与minnode(L->next)比较,返回较小的值
int maxnode(LinkNode *L)
{if(L->next==NULL)return L->data; return max(L->data,maxnode(L->next));
}int minnode(LinkNode *L)
{if(L->next==NULL)return L->data;return min(L->data,minnode(L->next));
}
【数据结构和算法笔记】递归详解(附题)相关推荐
- 数据结构与算法之时间复杂度详解
数据结构与算法之时间复杂度详解 目录 排序算法的介绍和分类 算法的时间复杂度概念 常见的时间复杂度解析 平均时间复杂度和最坏时间复杂度 空间复杂度介绍 1. 排序算法的介绍和分类 排序算法的介绍 排序 ...
- c++数据结构中 顺序队列的队首队尾_数据结构与算法—队列图文详解
前言 栈和队列是一对好兄弟,前面我们介绍过数据结构与算法-栈详解,那么栈的机制相对简单,后入先出,就像进入一个狭小的山洞,山洞只有一个出口,只能后进先出(在外面的先出去).而队列就好比是一个隧道,后面 ...
- java数据结构排序实验报告_java数据结构与算法之插入排序详解
本文实例讲述了java数据结构与算法之插入排序.分享给大家供大家参考,具体如下: 复习之余,就将数据结构中关于排序的这块知识点整理了一下,写下来是想与更多的人分享,最关键的是做一备份,为方便以后查阅. ...
- 匈牙利算法——最大匹配问题详解(附模板题)
基本概念转自 https://blog.csdn.net/dengheCSDN/article/details/77619308 匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名. ...
- 【数据结构与算法图文动画详解】终于可以彻底弄懂:红黑树、B-树、B+树、B*树、满二叉树、完全二叉树、平衡二叉树、二叉搜索树...
1.树简介 1.1基本概念 树是由结点或顶点和边组成的(可能是非线性的)且不存在着任何环的一种数据结构.没有结点的树称为空(null或empty)树.一棵非空的树包括一个根结点,还(很可能)有多个附加 ...
- 程序员必备的基本算法:递归详解
什么是递归? 递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法.简单来说,递归表现为函数调用函数本身.在知乎看到一个比喻递归的例子,个人觉得非常形象,大家看一下: ❝ 递归 ...
- 【数据结构】八大排序(超详解+附动图+源码)
目录 前言 常见排序算法的实现 1.插入排序 2.希尔排序 3.选择排序 4.堆排序 5.冒泡排序 6.快速排序 6.1 hoare版本 6.2挖坑法 6.3前后指针法 6.4快速排序优化 6.5快速 ...
- python【数据结构与算法】动态规划详解从背包到最长公共子序列(看不懂你来打我)
文章目录 1 引入 2 01背包 3 完全背包问题 4 多重背包问题 5 最长公共子序列 1 引入 0-1背包问题是最广为人知的动态规划问题之一,拥有很多变形.尽管在理解之后并不难写出程序,但初学者往 ...
- 【数据结构和算法】二叉树详解,动图+实例
- python直线拟合_RANSAC算法详解(附Python拟合直线模型代码)
之前只是简单了解RANSAC模型,知道它是干什么的.然后今天有个课程设计的报告,上去讲了一下RANSAC,感觉这个东西也没那么复杂,所以今天就总结一些RASAC并用Python实现一下直线拟合. RA ...
最新文章
- 自动驾驶安全框架开发进展综述
- Maven的这三个用法你一定要会!
- 常用的函数式接口_Predicate接口_默认方法ornegate
- Android 实现扑克牌动画,android – 重叠图像(扑克牌)
- SharePoint 2007 Select People and Groups中搜索不到其他Domain账户的问题[已解决]
- 信息学奥赛一本通(1254:走出迷宫)
- java 枚举 大小_Java枚举入门
- 第二单元答案计算机基础,《计算机基础》资源包-第二单元课后题答案.docx
- 【安全资讯】热门Windows激活软件KMSPico被植入恶意程序
- CentOS7 原生 yum 源修改为阿里 yum 源
- EFResume 一个普通的 Swift 简历模板
- 大学生如何学习c语言!
- python自动生成word目录_python win32com 库批量自动更新word目录
- TX-LCN分布式事务
- java生成tga图片_游戏制作行业为什么使用TGA格式的贴图而不使用PNG格式?
- InfoPath 2007 添加 access 2007 数据库方法
- 语中最美的十大经典爱情句子
- 从FFmpeg耻辱榜看开源软件的“潜规则”
- 学习虫师的《web接口开发与自动化测试1-5章》
- win7安装office2007失败