【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素
【练习3.11】
编写查找一个单链表特定元素的程序。分别用递归和非递归实现,并比较它们的运行时间。
链表必须达到多大才能使得使用递归的程序崩溃?
Answer:
实现都是比较容易的,但是实际上查找链表元素本身也没必要使用递归的方法。
考虑到题目让人比较运行时间与程序崩溃的边界,可以认为这是警示大家不要滥用递归的题目【【
毕竟在算法本身足够简单的时候,递归压栈会浪费大量额外空间与时间。
个人设备实测下,链表长度约5000时递归查找即崩溃,而迭代可在1000000长度的链表下正确运行。
测试代码如下:
#include <iostream>
#include "linklist.h"
using linklist::List;
using namespace std;
int main(void)
{
List<int> number;
for (int i = ; i < ; ++i)
number.additem(i);
//测试两种查找的结果
cout << (number.find() == number.find_recursive()) << endl;
cout << (number.find() == number.find_recursive()) << endl;
cout << (number.find() == number.find_recursive()) << endl;
cout << (number.find() == number.find_recursive()) << endl; //通过调整循环次数,确定链表多长时递归会溢出
for (int i = ; i < ; ++i)
number.additem();
number.additem();
//取消下面两种查找的注释,测试各自在多长的链表下能够运行
//在个人的设备上,迭代算法循环百万次后仍可运行
//而递归算法约5000次时即会溢出
//number.find(40);
//number.find_recursive(40); system("pause");
}
实现代码如下:
//练习3.11新增,递归查找链表元素
template <typename T> Node<T>* List<T>::find_recursive(const T &item)
{
return findr(item, front);
}
template<typename T> Node<T>* List<T>::findr(const T &item, Node<T>* pos)
{
if (pos == nullptr || pos->data == item)
return pos;
else
return findr(item, pos->next);
}
其中,find_recursive在模板内声明为public,使用时调用该函数。而findr在模板内为private,是实际运算的执行者。
【Weiss】【第03章】练习3.11:比较单链表递归与非递归查找元素的更多相关文章
- 【11】-java递归和非递归二叉树前序中序后序遍历
二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...
- 【Weiss】【第03章】增补附注
基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...
- 第03章_基本的SELECT语句
第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...
- suse 12 二进制部署 Kubernetets 1.19.7 - 第03章 - 部署flannel插件
文章目录 1.3.部署flannel网络 1.3.0.下载flannel二进制文件 1.3.1.创建flannel证书和私钥 1.3.2.生成flannel证书和私钥 1.3.3.将pod网段写入et ...
- 第03章 AOP前奏
第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...
- 数据结构与算法分析——C语言描述 第三章的单链表
数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...
- 第二十二章 Django会话与表单验证
第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...
- Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归
Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...
- 【Weiss】【第03章】练习3.25:数组模拟队列
[练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...
随机推荐
- btrace简单使用
基本安装 在github上btrace项目的release下 下载最新的btracehttps://github.com/btraceio/btrace/releases 解压完后,将btrace的b ...
- 极力推荐大佬的java项目的博客
此次说明:这是我从码云上拉取下来的java项目,仅供试验说明,不做任何获利渠道,若是发现有人拿此做其他用处,需像码云上这位大佬说明,特此感谢!!! 准备工作: 安装 maven,jdk1.8, ...
- 垃圾回收GC
每种语言都有自己的垃圾回收机制.接下来我们来讲一下python的垃圾回收机制. 小整数对象池:python对小整数的定义为[-5,257),这些整数对象是提前建立好的,不会被垃圾回收.单个字母也一 ...
- 码海拾遗:strstr()、strcmp()和strcpy()实现
1.strstr()实现 原型:char * strstr(const char * str1, const char * str2) 说明:判断str2是否为str1的子串,如果是则返回str2第一 ...
- View 属性
关于 View 设置属性的方式: JavaxmlstyledefStyleAttrdefStyleResTheme 关于 defStyleRes 的使用,和在 xml 中声明 style=" ...
- python中使用paramiko模块并实现远程连接服务器执行上传下载
paramiko模块 paramiko是用python语言写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接. 因此,如果需要使用SSH从一个平台连接到另外一个平台,进行一系 ...
- 制作UEFI(64位)下的WinPE + Ubuntu + Acronis多启动U盘
最近研究了一下如何制作一个多启动U盘,其中想包含的功能是WinPE(这里选择WEPE),Ubuntu 18.04,Acronis True Image 2018的ISO恢复盘.这里分享一下制作的经验和 ...
- 《数据结构与算法》—— O(3N)=O(N) ?
上帝的磨盘转动很慢,但是却磨得很细. --毛姆 本文已经收录至我的GitHub,欢迎大家踊跃star 和 issues. https://github.com/midou-tech/articles ...
- django之学习前的准备
一.配置环境 Windows 10操作系统 Python安装配置教程参考:https://www.cnblogs.com/huangbiquan/p/7784533.html 安装Python虚拟环境 ...
- Reids(4)——神奇的HyperLoglog解决统计问题
一.HyperLogLog 简介 HyperLogLog 是最早由 Flajolet 及其同事在 2007 年提出的一种 估算基数的近似最优算法.但跟原版论文不同的是,好像很多书包括 Redis 作者 ...