【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小题就可以. 数组模拟队列和链表的两点小不同是: ①.数组空 ...
随机推荐
- DjangoModels
传智博客的python的笔记 数据库配置 ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换 ...
- Cenos配置Android集成化环境, 最终Centos libc库版本过低放弃
To honour the JVM settings for this build a new JVM will be forked. Please consider using the daemon ...
- STM32 CAN 发送和接收 寄存器变化过程
发送:
- 关于apache的几个常见问题
一.安装apache的时候总是不成功,提示:failed to open the winnt service manager 原因:软件安装时与windows7的"用户账户控制"( ...
- OSX编译安装Python3及虚拟开发环境Virtualenv
0X00.前言 因为工作原因,最近主要做Python开发,刚好电脑系统重装之后所有的东西都需要重新配置.此文主要记录OSX下通过源码编译安装Python3以及安装虚拟开发环境Virtualenv. 0 ...
- Magic Methods 5
描述符 : 将某种特殊类型的类的实例指派给另一个类的属性. 特殊类型为以下方法的1-3个 : __get__(self, instance, owner):用于访问属性,它返回属性的值 __set__ ...
- C++扬帆远航——13(个人所得税计算器)
/* * Copyright (c) 2016,烟台大学计算机与控制工程学院 * All rights reserved. * 文件名:shui.cpp * 作者:常轩 * 微信公众号:Worldhe ...
- Ubutun18.04安装Python3.7.6
最近因为环境问题,简单记录下Python3.7的安装过程: 下载地址:http://python.org/ftp/python/3.7.6/Python-3.7.6.tgz 编译安装步骤: sudo ...
- App崩溃监控
常见马虎导致崩溃 1 数组越界: 2 多线程问题,在子线程刷新UI: 3 主线程无响应,主线程超过系统规定的时间没有响应,就会被watchdog杀掉: 4 野指针: 崩溃信息的收集却并没有那么简单.因 ...
- JUC常用同步工具类——CountDownLatch,CyclicBarrier,Semaphore
在 JUC 下包含了一些常用的同步工具类,今天就来详细介绍一下,CountDownLatch,CyclicBarrier,Semaphore 的使用方法以及它们之间的区别. 一.CountDownLa ...