【练习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:比较单链表递归与非递归查找元素的更多相关文章

  1. 【11】-java递归和非递归二叉树前序中序后序遍历

    二叉树的遍历 对于二叉树来讲最主要.最基本的运算是遍历. 遍历二叉树 是指以一定的次序访问二叉树中的每个结点.所谓 访问结点 是指对结点进行各种操作的简称.例如,查询结点数据域的内容,或输出它的值,或 ...

  2. 【Weiss】【第03章】增补附注

    基本上每章到增补附注这里就算是结束了. 根据设想,每章的这一篇基本上会注明这一章哪些题没有做,原因是什么,如果以后打算做了也会在这里补充. 还有就是最后会把有此前诸多习题的代码和原数据结构放整理后,以 ...

  3. 第03章_基本的SELECT语句

    第03章_基本的SELECT语句 1. SQL概述 1.1 SQL背景知识 1946 年,世界上第一台电脑诞生,如今,借由这台电脑发展起来的互联网已经自成江湖.在这几十年里,无数的技术.产业在这片江湖 ...

  4. 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 ...

  5. 第03章 AOP前奏

    第03章 AOP前奏 提出问题 ●情景:数学计算器 ●要求 ①执行加减乘除运算 ②日志:在程序执行期间追踪正在发生的活动 ③验证:希望计算器只能处理正数的运算 ●常规实现 ●问题 ○代码混乱:越来越多 ...

  6. 数据结构与算法分析——C语言描述 第三章的单链表

    数据结构与算法分析--C语言描述 第三章的单链表 很基础的东西.走一遍流程.有人说学编程最简单最笨的方法就是把书上的代码敲一遍.这个我是头文件是照抄的..c源文件自己实现. list.h typede ...

  7. 第二十二章 Django会话与表单验证

    第二十二章 Django会话与表单验证 第一课 模板回顾 1.基本操作 def func(req): return render(req,'index.html',{'val':[1,2,3...]} ...

  8. Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归

    Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 目录 Python函数03/函数名的第一类对象及使用/f 格式化/迭代器/递归 内容纲要 1.函数名的第一类对象及使用 2.f ...

  9. 【Weiss】【第03章】练习3.25:数组模拟队列

    [练习3.25] 编写实现队列的例程,使用 a.链表 b.数组 Answer: 在这章一开头就已经写了个链表的队列例程了,所以实际上只要做b小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...

随机推荐

  1. WordPress快速打造个人博客

    前些天用wordpress搭建了现在这个博客,所以总结了一篇文章,讲讲怎么样简单的创建一个博客.开始前这里有篇我搭建时所遇到的问题可以作为参考<WordPress建站注意事项>,首先我们要 ...

  2. Python 项目结构

    Python 项目结构 实验准备 我们的实验项目名为 factorial. 12 $ mkdir factorial$ cd factorial/ 主代码 我们给将要创建的 Python 模块取名为 ...

  3. unittest(22)- p2p项目实战(2)-http_request

    # 2. http_request.py import requests from learn_logging_5.write_log_class import MyLog my_logger = M ...

  4. tips [ 18870 ]

    Created at 2017-08-23 Updated at 2018-01-31 Category 东方大陆 Tag 东方大陆 上面有编辑时间的,别吐槽说什么过期内容了使用 lightPIC图床 ...

  5. 基于USB接口芯片CH372的人机接口设备设计与实现(转)

    摘 要: 基于一种新型USB 总线接口芯片CH372,设计出一种人机接口设备-USB 鼠标.阐述了CH372 的工作原理和特点,给出了系统的硬件电路图:在软件设计中,分析了HID 类设备描述符枚举过程 ...

  6. 3D打印如何重组制造格局?

    ​全球化的竞争正变得毫无底线,国与国之间只有利益,没有同情,也就是说美国品牌想把自己的工厂移回本土,是不会考虑中国工人的生存现状的,更不会顾及这里的GDP和环境问题,甚至还会依靠经济能力去奴役其他国家 ...

  7. acedCommandS 实现pedit命令

    acedCommandS(RTSTR, _T("PEDIT"),                RTSTR, _T("M"),                R ...

  8. C++扬帆远航——6(三色球)

    /* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:sanseqiu.cpp * 作者:常轩 * 完成日期:2016 ...

  9. 压力测试(九)-Jmeter压测课程总结和架构浅析

    安装常见问题 1.问题 [root@iZwz95j86y235aroi85ht0Z bin]# ./jmeter-server Created remote object: UnicastServer ...

  10. vmware workstaion之不能连接外网

    Vmwareworkstation15系列桥接模式不能上网解决办法 最近在vmwareworkstation15中创建一个双网卡虚拟机,由于一直连不了外网,一直困扰着我.各种姿势在百度谷歌查找,最终还 ...