剑指offer笔记(十)递归和循环
递归和循环
什么是递归?
递归就是在一个函数内部调用函数本身
什么是循环?
循环通过设置计算初始值及终止条件,在此范围内重复计算
举例说明一下:
1+2+3+...+n求和
//循环
int sum(int n)
{int res=0;for(int i=1;i<=n;i++){res+=i;}return res;
}//递归
int sum(int n)
{return n==0?0:n+sum(n-1);
}
从上述代码可以明显感觉到:递归简洁明了
但递归也存在一定的不安全性:
(1)我们都知道函数调用需要在内存栈中分配空间以保存参数,返回地址及临时变量,以及数据压栈和出栈都需要时间,而递归每一次调用函数本身都需要时间和空间开销
(2)递归本质是分治思想,化大为小,但如果小问题如果存在相互重叠部分,导致很多计算都是重复
(3)每一次函数调用在内存中分配空间,而每个进程的栈容量都是有限,调用层数过多就会导致栈溢出
一说起递归,或许大家都可以想到最为经典的斐波那契数列
//递归
int fibonacci(int n)
{if(n<=0)return 0;if(n==1)return 1;return fibonacci(n-1)+fibonacci(n-2);
}//迭代
int fibonacci(int n)
{if(n<2)return n;int f1=0;int f2=1;int fn;for(int i=2;i<=n;i++){fn=f1+f2;f1=f2;f2=fn;}return fn;
}
上述代码中,第一种为递归实现,第二种为利用递归思想通过循环迭代实现,递归实现虽然简单,但是如果n过大就会导致时间复杂度过高,甚至导致栈溢出,其主要原因就是存在过多重复计算,采用第二种方法有效保存已经计算过的结果,大大降低时间复杂度
剑指offer笔记(十)递归和循环相关推荐
- 剑指offer里的递归与循环
文章目录 递归怎么解 根据前序中序序列重建二叉树 从尾到头打印链表 递归产生的问题 Fibonacci数列 跳台阶 变态跳台阶 总结 其实这是第二遍刷剑指offer,发现已经忘得差不多了-虽然说有印象 ...
- 剑指Offer(十九):顺时针打印矩阵
剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...
- 剑指offer笔记(七) 第47题至第53题
剑指offer笔记(七) 第47题至第53题 前言 一.JZ47 礼物的最大价值 二.JZ48 最长不含重复字符的子字符串 三.JZ49 丑数 四.JZ50 第一个只出现一次的字符 五.JZ51 数组 ...
- 萌萌媛の【剑指offer笔记】二维数组中的查找
题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...
- 剑指Offer第十天——T46——动态规划
剑指OfferT46 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l&q ...
- 每列大于0的个数_二进制中1的个数(剑指offer第十四天)
二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...
- 《剑指offer》非递归法判定二叉树是否是对称的
题目:请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 解析:该非递归法有点傻傻的,思想是利用队列进行层次遍历.然后翻转该二叉树,再层次遍 ...
- 剑指offer二十二之从上往下打印二叉树
一.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 二.思路 二叉树的层次遍历,可以借助队列实现.具体思路详见注释. 三.代码 import java.util.ArrayList; i ...
- 剑指offer笔记(九)栈和队列
栈:先进后出 队列:先进先出 用栈实现队列 通过两个栈,利用先进后出的特性循环得到先进先出的特性 class MyQueue { public:stack<int> pushst;stac ...
最新文章
- php排除无效字查询,php删除无效的字符
- 几大科技公司在VR方面的布局是怎么样的?
- 【PAT】1009. Product of Polynomials (25)
- Nginx配置报错unknown directive echo的解决
- 11)PHP,单选框和复选框的post提交方式处理
- 阿里云OSS-对象存储流程梳理演示
- 英语分词组_考生必看!成人高考英语大牛教你如何轻松考高分
- html动画转换为桌面动态壁纸,动态桌面:把精彩的flash动画设为桌面
- 博客园官方 NuGet镜像上线试运行
- 温故js系列(7)-数组去重由慢到快由繁到简
- 自定义xadmin后台首页
- 万字精华——Python常见的60+面试题合集双手奉上!
- boost::algorithm学习
- oracle中的job重要吗,关于Oracle的job的一些总结
- js 页面 json对象转数组
- mellanox 网卡驱动,Mellanox网卡OFED驱动安装
- CAD2006提示没有足够的权限来安装此产品
- 与Anthony Baldino一起塑造声音
- 两两独立为什么不能推出相互独立
- 论文详读:LEMNA: Explaining Deep Learning based Security Applications
热门文章
- linux下vi与vim区别以及vim的使用-------vim编辑时脚本高光显示语法
- 解决VM 与 Device/Credential Guard 不兼容问题
- php rsa公钥加密,PHP RSA加密
- Linux系统文件目录指令详解——文件路径查看、创建和删除目录、文件移动与重命名、文件查看
- Jmeter安装部署及压力测试- QPS量化方法
- w3c h5 + css + js笔记
- CreCloud云网管管理平台操作流程
- 【百度快照】基于MATLAB的人民币纸币系列号面额识别系统【GUI】
- 计算机网络-网络层详细讲解
- world wind java_WorldWind Java 版学习:1、启动过程