递归和循环

什么是递归?

递归就是在一个函数内部调用函数本身

什么是循环?

循环通过设置计算初始值及终止条件,在此范围内重复计算

举例说明一下:

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笔记(十)递归和循环相关推荐

  1. 剑指offer里的递归与循环

    文章目录 递归怎么解 根据前序中序序列重建二叉树 从尾到头打印链表 递归产生的问题 Fibonacci数列 跳台阶 变态跳台阶 总结 其实这是第二遍刷剑指offer,发现已经忘得差不多了-虽然说有印象 ...

  2. 剑指Offer(十九):顺时针打印矩阵

    剑指Offer(十九):顺时针打印矩阵 搜索微信公众号:'AI-ming3526'或者'计算机视觉这件小事' 获取更多算法.机器学习干货 csdn:https://blog.csdn.net/baid ...

  3. 剑指offer笔记(七) 第47题至第53题

    剑指offer笔记(七) 第47题至第53题 前言 一.JZ47 礼物的最大价值 二.JZ48 最长不含重复字符的子字符串 三.JZ49 丑数 四.JZ50 第一个只出现一次的字符 五.JZ51 数组 ...

  4. 萌萌媛の【剑指offer笔记】二维数组中的查找

    题目描述: 在一个二维数组中(每个一维数组的长度相同),每一行都按照从左到右递增的顺序排序,每一列都按照从上到下递增的顺序排序.请完成一个函数,输入这样的一个二维数组和一个整数,判断数组中是否含有该整 ...

  5. 剑指Offer第十天——T46——动态规划

    剑指OfferT46 题目描述 给定一个数字,我们按照如下规则把它翻译为字符串:0 翻译成 "a" ,1 翻译成 "b",--,11 翻译成 "l&q ...

  6. 每列大于0的个数_二进制中1的个数(剑指offer第十四天)

    二进制中1的个数 题目:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数.例如,把 9 表示成二进制是 1001,有 2 位是 1.因此,如果输入 9,则该函数输出 2. 示例 1: 输 ...

  7. 《剑指offer》非递归法判定二叉树是否是对称的

    题目:请实现一个函数,用来判断一颗二叉树是不是对称的.注意,如果一个二叉树同此二叉树的镜像是同样的,定义其为对称的. 解析:该非递归法有点傻傻的,思想是利用队列进行层次遍历.然后翻转该二叉树,再层次遍 ...

  8. 剑指offer二十二之从上往下打印二叉树

    一.题目 从上往下打印出二叉树的每个节点,同层节点从左至右打印. 二.思路 二叉树的层次遍历,可以借助队列实现.具体思路详见注释. 三.代码 import java.util.ArrayList; i ...

  9. 剑指offer笔记(九)栈和队列

    栈:先进后出 队列:先进先出 用栈实现队列 通过两个栈,利用先进后出的特性循环得到先进先出的特性 class MyQueue { public:stack<int> pushst;stac ...

最新文章

  1. php排除无效字查询,php删除无效的字符
  2. 几大科技公司在VR方面的布局是怎么样的?
  3. 【PAT】1009. Product of Polynomials (25)
  4. Nginx配置报错unknown directive echo的解决
  5. 11)PHP,单选框和复选框的post提交方式处理
  6. 阿里云OSS-对象存储流程梳理演示
  7. 英语分词组_考生必看!成人高考英语大牛教你如何轻松考高分
  8. html动画转换为桌面动态壁纸,动态桌面:把精彩的flash动画设为桌面
  9. 博客园官方 NuGet镜像上线试运行
  10. 温故js系列(7)-数组去重由慢到快由繁到简
  11. 自定义xadmin后台首页
  12. 万字精华——Python常见的60+面试题合集双手奉上!
  13. boost::algorithm学习
  14. oracle中的job重要吗,关于Oracle的job的一些总结
  15. js 页面 json对象转数组
  16. mellanox 网卡驱动,Mellanox网卡OFED驱动安装
  17. CAD2006提示没有足够的权限来安装此产品
  18. 与Anthony Baldino一起塑造声音
  19. 两两独立为什么不能推出相互独立
  20. 论文详读:LEMNA: Explaining Deep Learning based Security Applications

热门文章

  1. linux下vi与vim区别以及vim的使用-------vim编辑时脚本高光显示语法
  2. 解决VM 与 Device/Credential Guard 不兼容问题
  3. php rsa公钥加密,PHP RSA加密
  4. Linux系统文件目录指令详解——文件路径查看、创建和删除目录、文件移动与重命名、文件查看
  5. Jmeter安装部署及压力测试- QPS量化方法
  6. w3c h5 + css + js笔记
  7. CreCloud云网管管理平台操作流程
  8. 【百度快照】基于MATLAB的人民币纸币系列号面额识别系统【GUI】
  9. 计算机网络-网络层详细讲解
  10. world wind java_WorldWind Java 版学习:1、启动过程