很久找不到学习的平衡点,似乎有目的性的去解决问题寻求方法获得知识会比直接吸取知识要有趣,更印象深刻,这些都是我爬过的坑,以此铭记在心。

1. 队列在程序调用时必不可少,因此递归离不开队列。×

递归是栈实现的。栈是先进后出,也就是上次递归调用的时候,保存在栈顶。在返回的时候出栈,所以是递归依靠栈实现的

递归的定义:递归调用是一种特殊的嵌套调用,是某个函数调用自己或者是调用其他函数后再次调用自己的,只要函数之间互相调用能产生循环的则一定是递归调用

递归的特点:

  • 函数要直接或间接调用自身。
  • 要有递归终止条件检查,即递归终止的条件被满足后,则不再调用自身函数,函数的调用原则和数据结构栈的实现是相一致。(类似于不断压栈,直到栈满,作为终止条件)
  • 如果不满足递归终止的条件,则调用涉及递归调用的表达式。在调用函数自身时,有关终止条件的参数要发生变化,而且需向递归终止的方向变化。
2. 以下程序是用来计算两个非负数之间的最大公约数:
long long gcd(long long x, long long y) {if (y == 0)return x;elsereturn gcd(y, x % y);
}

我们假设x,y中最大的那个数的长度为n,基本运算时间复杂度为O(1),那么该程序的时间复杂度为o(log n)

求最大公约数用的是辗转相除法欧几里得算法):两个整数的最大公约数等于其中较小的那个数和两数相除余数的最大公约数,所以是O(log n)。最大公约数还有Stein算法计算

3. 设有递归算法如下,
int x(int n)
{if(n<=3)return 1;elsereturn x(n-2)+x(n-4)+1;
}

试问计算x(x(8))时需要计算18次x函数。

根据题意,易得x(3) = x(2) = x(1) = x(0) = 1
x(8) = x(6) +x(4) +1
= x(4) + x(2) +1 + x(2) + x(0) +1 + 1
= x(2) + x(0) +1 + 1 + 1 +1 + 1 +1 + 1
= 9
x(8) 这个就调用了9次函数x(int n)
同理可得x(9)也是调用了9次函数x(int n)

所以总共18次。

4. 4个圆盘的Hanoi塔,总的移动次数为15

Hanoi 问题的理解是:

  • 先把上面n-1个圆盘移到第二个柱子上(共f(n-1)步)
  • 再把最后一个圆盘移到第三个柱子(共1步)
  • 再把第二柱子上的圆盘移动到第三个柱子上(共f(n-1)步)
    于是得出其递推方程:f(n)=f(n-1)+1+ f(n-1)=2*f(n-1)+1
5.对递归程序的优化的一般的手段为尾递归优化

常见的优化手段有尾递归,迭代,循环

尾递归:在每一次递归的过程中保持了上一次计算的状态,也就是“线性迭代过程”

尾递归和一般的递归不同在对内存的占用,普通递归创建stack累积而后计算收缩,尾递归只会占用恒量的内存(和迭代一样)

举个例子,计算n的阶乘

//线性递归long Rescuvie(long n) {return (n == 1) ? 1 : n * Rescuvie(n - 1);}//尾递归
long TailRescuvie(long n, long a) {return (n == 1) ? a : TailRescuvie(n - 1, a * n);}long TailRescuvie(long n) {//封装用的return (n == 0) ? 1 : TailRescuvie(n, 1);}

牛客网递归错题:递归、欧几里得求最大公约数的时间复杂度、线性递归与尾递归实例区别相关推荐

  1. 牛客网算法错题笔记总结

    最近在做一些牛客网的编程题和算法题:把一些比较生疏的知识点记下来,自己复习,也供大家参考: 1.给定节点数n后,求二叉树最多的结构 结构数量num = C(2n,n)/n+1;其中n是给定的节点数,比 ...

  2. 牛客网——综合错题集

    1.tcpdump 是简单可靠网络监控的实用工具 netstat 显示网络有关的信息,比如套接口使用情况.路由.接口.协议等 ifconfig 是查看活动的网卡信息 top 显示活动进程方面的情况 2 ...

  3. 算法记录 牛客网 leetcode刷题记录

    算法记录 & 牛客网 & leetcode刷题记录 解题思路 STL容器 常用算法模板 堆排序 插入排序 快速排序 BFS层序遍历 二叉树 JZ55 二叉树的深度 BST(binary ...

  4. 牛客网Java刷题知识点之Java 集合框架的构成、集合框架中的迭代器Iterator、集合框架中的集合接口Collection(List和Set)、集合框架中的Map集合...

    不多说,直接上干货! 集合框架中包含了大量集合接口.这些接口的实现类和操作它们的算法. 集合容器因为内部的数据结构不同,有多种具体容器. 不断的向上抽取,就形成了集合框架. Map是一次添加一对元素. ...

  5. 牛客网SQL刷题笔记(MySQL)

    牛客网SQL刷题笔记(MySQL) 此博客集合LeetCode.牛客网常见的题型及其解法,侵删 目录 牛客网SQL刷题笔记(MySQL) 类型1:查找排名第几的数据 SQL2 查找入职员工时间排名倒数 ...

  6. 牛客网Java刷题知识点之关键字static、static成员变量、static成员方法、static代码块和static内部类...

    不多说,直接上干货! 牛客网Java刷题知识点之关键字static static代表着什么 在Java中并不存在全局变量的概念,但是我们可以通过static来实现一个"伪全局"的概 ...

  7. 牛客网Java刷题知识点之构造函数可以调用一般函数,但是一般函数不可以直接调用构造函数...

    不多说,直接上干货! 通过 牛客网Java刷题知识点之构造函数是什么.一般函数和构造函数什么区别呢.构造函数的重载.构造函数的内存图解 我们对构造函数有了一个比较清楚的认识,当我们在创建对象时,我们会 ...

  8. 牛客网Java刷题知识点之ArrayList 、LinkedList 、Vector 的底层实现和区别

    不多说,直接上干货! 这篇我是从整体出发去写的. 牛客网Java刷题知识点之Java 集合框架的构成.集合框架中的迭代器Iterator.集合框架中的集合接口Collection(List和Set). ...

  9. 牛客网Veirlog刷题答案目录(持续更新)

    牛客网Veirlog刷题答案目录(持续更新) 基础篇 进阶篇 基础篇 1.VL1--四选一多路选择器 2.VL2--异步复位的串联T触发器 3.VL3--奇偶校验 4.VL4--移位运算与乘法 5.V ...

最新文章

  1. Vue开发使用Axios遇到了大坑!
  2. 建设公司的技术+企业客户的沟通=极致运行的网站
  3. adb启动失败 ADB server didn't ACK
  4. 计算机网络把许多什么连接在一起,计算机网络技术基础知识汇总习题
  5. esxi备份,datastore,vmdk
  6. 指针java_浅谈Java与指针 - 穿梭于偶然
  7. html盒子中盒子排列,解析CSS的box model盒模型及其内的子元素布局控制
  8. C++读取WINDOWS注册表
  9. SuperMap iClient3D for WebGL实现三维管线分析
  10. 融云 SDK 如何实现群组操作
  11. 人工智能“国家队”云从科技行人再识别达到96.6%,创世界纪录;知产链IPC与雷神展开合作,推出雷神通证
  12. 东汉十三州以及各个郡的说明
  13. CRC8/CRC16/CRC32最全总结
  14. 如何从mp4视频格式中提取出mp3音频格式
  15. 两种领导力:温柔与严厉
  16. 用Java开发50个棋类游戏
  17. khadas与树莓派_抛弃电信机顶盒,单板电脑打造家庭多媒体中心
  18. [python]遍历字典dict的几种方法
  19. AMI主板BIOS菜单图文讲解设置!
  20. MT6753芯片资料MT6753处理器分析

热门文章

  1. 初中知识会不会影响计算机,初中计算机论文
  2. Struct2中三种获取表单数据的方式
  3. 《服务外包概论》实验报告——版本管理与控制工具的综合应用
  4. jQuery——封装form表单的数据为json对象
  5. Spring Boot——基于OkHTTP的GitHub第三方登录DEMO
  6. Thief in a Shop
  7. 指令级别解释对象创建过程和DCL为什么要volatile
  8. 蓝桥杯【(经验+资源)分享】【从零备考 蓝桥杯】说说我的经历及备考经验
  9. Android复习11【service-音乐播放器、定时器、IntentService、ALDL使用】
  10. Ubuntu系统配置JDK环境变量