每次用递归都感觉有点难,这个趁着恶补基础知识的时候,专门看了一遍递归,算法4的。

1.1 递归介绍

方法可以调用自己,例如:下面给出了bin_search的二分查找的一种实现。(算法4中使用的是Java,但是我是c++系的,就用c++实现,语言不重要)。我们就会经常使用递归,因为递归代码比相应的非递归代码更加简洁优雅、易懂。下面这种实现中的注释就言简意赅地说明了代码的作用。

int bin_search(int key, int *a, int left, int right)
{//递归第一条,总是包含一个return的语句if(left > right) return -1;int middle = left + (right - left)/2;if(key < a[middle])  bin_search(key, a, left, middle-1);\else if(key > a[middle]) bin_search(key, a, middle+1, right);else return middle;
}

编写递归代码时最重要的有以下三点。

  1. 递归总有一个最简单的情况——方法的第一条语句总是一个包含return的条件语句。
  2. 递归调用总是去尝试解决一个规模更小的子问题,这样递归才能收敛到最简单的情况。在上面代码中,第四个参数和第三个参数的差值一直在缩小。
  3. 递归调用的父问题和尝试解决的子问题不应该有交集。在上面代码中,两个子问题各自操作的数组部分是不同的。

违背其中任意一条都可能得到错误的结果或低效的代码,而坚持这些原则能写出清晰,正确且容易评估性能的程序。使用递归的另一个原因是我们可以使用数学模型来估计程序的性能。这个要在后面讲。

1.2 练习

看了递归的总结了之后,要做做练习题,控固一些递归的知识点,所以就做算法4,第一节的练习题。

1.1.16 给出exR1(6)的返回值

string exR1(int n)
{if(n < 0) return "";return exR1(n - 3) + n + exR1(n - 2) + n;
}int main()
{cout << "递归代码学习" << endl;string str = exR1(6);cout << str << endl;return 0;
}

c++好像不知道string加法,不过就这样吧,我们不执行了,直接推结果。

这里已经把递归的流程分析,递归分析不用慌,一层一层分析,知道返回的时候,就有结果了,这道题的答案是:311361142246。

1.1.17 找出一下递归函数的问题

string exR2(int n)
{string s = exR2(n -3)+ n + exR2(n -2)+ n;if(n < 0) return "";return s;
}

这一个是违反了递归的第一条性质,也就是第一条不包含return语句,这样导致递归函数一直递归,知道把栈搞溢出。

1.1.18 请看一下递归函数

int mustery(int a, int b)
{if(b == 0) return 0;if(b % 2 == 0) return mustery(a+a, b/2);return mustery(a+a, b/2) + a;
}

mustery(2, 25)和mustery(3, 11)的返回值是多少

这个递归比较简单,只要一个方向递归,像第一题两个方向递归才难。

1.1.19 在计算机上运行一下程序

long F(int N)
{if(N==0) return 0;if(N==1) return 1;return F(N-1)+F(N-2);
}

计算这段程序在一个小时之内能够得到的F(N)结果的最大N值是多少?这个有谁知道,可以讲解一波,我也不清楚。
开发F(N)的一个更好的实现,用数组保存已经计算过的值。

long F2(int N, long *value)
{//static long *value = new long[N];if(N == 0){value[0] = 0;value[1] = 1;return 0;}if(N == 1){value[0] = 0;value[1] = 1;return 1;}//printf("N %ld %ld %ld\n", N, value[N-1]+value[N-2]);value[N-1] = F2(N-1, value);return value[N-1]+value[N-2];
}

递归函数还是一贯都是开始是return,因为我们要从0,1开始,所以0,1需要做特殊处理,然后从2开始的话,我们就递归算出每个数组的值,然后利用已经保存好的数组的值,然后在相加,就得到了想要的结果。

1.1.20 编写一个递归的静态方法计算ln(N!)的值

unsigned long jieceng(int N)
{if(N == 1 || N == 0) {return 1;}return jieceng(N-1)*N;
}

这是阶乘的答案

算法4(一、递归学习)相关推荐

  1. 数据结构与算法学习③(Hash hash算法的工程应用 递归 )

    Hash Hash 散列表(Hash Table) 概述 散列函数 散列冲突 复杂度分析 工程应用 面试实战 亚马逊,微软最近面试题,242. 有效的字母异位词 腾讯,高盛集团最近面试题,49. 字母 ...

  2. ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​

    相似算法比较:递归.分治.动态规划.贪心.回溯.分支限界 ​ 在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们 ...

  3. 从贪心算法到暴力递归法——从局部最优到整体最优

    从递归看动态规划 前情提要 最优问题的本质 目标函数 最优组合的求解策略 枚举 递归 斐波那契数列 问题描述 示例 解题思路 迭代 递归 深入理解递归 堆栈与递归的状态存储 递归与回溯 树形结构与深度 ...

  4. [算法系列] 深入递归本质+经典例题解析——如何逐步生成, 以此类推,步步为营

    [算法系列] 深入递归本质+经典例题解析--如何逐步生成, 以此类推,步步为营 本文是递归系列的第三篇, 第一篇介绍了递归的形式以及递归设计方法(迭代改递归),;第二篇以递归为引子, 详细介绍了快排和 ...

  5. 【数据结构与算法】如何高效学习数据结构与算法

    前言 本文是个人基于覃超老师的<算法训练营>的学习笔记,此笔记的内容都是学习后的个人记录.个人总结.理解和思想.仅供参考学习. 很多同学在大学的时候会觉得数据结构与算法很枯燥,很多小伙伴都 ...

  6. 使用聚类算法进行标签传播学习(Clustering for Semi-Supervised Learning)

    使用聚类算法进行标签传播学习(Clustering for Semi-Supervised Learning) 目录 使用聚类算法进行标签传播学习(Clustering for Semi-Superv ...

  7. 深度 | 学习如何学习的算法:简述元学习研究方向现状

    要想实现足够聪明的人工智能,算法必须学会如何学习.很多研究者们曾对此提出过不同的解决方案,其中包括 UC Berkeley 的研究人员提出的与模型无关的元学习(MAML)方法.本文将以 MAML 为例 ...

  8. Bengio、Hinton的不懈追求——深度学习算法揭示大脑如何学习

    来源:AI科技评论 编译:Don 校对:青暮 "如果我们能够揭示大脑的某些学习机制或学习方法,那么人工智能将能迎来进一步的发展,"Bengio如是说. 深度学习依赖于精妙设计的算法 ...

  9. Scala 递归学习的例子

    Scala 递归学习的例子 为了学习Spark,我开始了学习Scala.加油! 递归的一个题目: 代码: // Why x is Float, but when we use 3.0 for exam ...

  10. 关于Retinex图像增强算法的一些新学习

    关于Retinex图像增强算法的一些新学习. - Imageshop 时间 2014-06-26 16:50:00  博客园精华区 原文  http://www.cnblogs.com/Imagesh ...

最新文章

  1. 使用NetworkX绘制深度神经网络结构图(Python)
  2. 百度云Java三面,面试题及答案!
  3. 读游戏之旅-我的编程感悟:难得的休闲读物
  4. 皇室战争:渔夫化身“战场搅屎棍”,见人就拉,选卡很关键
  5. Linux自动解压部署WEB项目脚本
  6. Android 应用程序获得系统权限
  7. 力扣题目系列:1370. 上升下降字符串(Python题解)
  8. 决策树分类器vc维如何计算_机器学习入门第三章:决策树分类器-理论
  9. 阶段1 语言基础+高级_1-3-Java语言高级_06-File类与IO流_07 缓冲流_7_练习_对文本的内容进行排序...
  10. System.Net.Http.Formatting的nuget版本冲突问题
  11. 为什么float只有四个字节,存储范围却大于有八个字节的long类型?
  12. 浩哥的Linux学习笔记之cp命令
  13. 独家:程序员必备Java API和类搜索辅助工具发布
  14. 【时间之外】几张图说清楚供应链金融赚钱方法
  15. 没有智商,善良有个P用
  16. leetcode1079.活字印刷C++
  17. CentOS7 搭建 DNS 域名解析服务器
  18. 基于FPGA的数字示波器的触发/采集
  19. DMIScope 1.00.005 注册版
  20. ueditor插入第三方视频链接不显示,输入视频地址有误

热门文章

  1. 发那可g10_fanuc系统中的G10
  2. .net课堂流水账_20110116
  3. 408考研经验分享(待更
  4. Axure_RP8.0软件+汉化包
  5. 使用spring data Querydsl 实现动态查询功能
  6. JPA+QueryDSL
  7. 一分六钱用计算机怎么算,交行信用卡分期付款计算器:5000元分6期手续费
  8. flowable设计器节点属性扩展_gooflow设计器API说明书
  9. 软件开发过程模型(瀑布模型,快速原型模型,螺旋模型)
  10. Activiti学习记录 Activiti初始化数据库、Activiti6增加表注释字段注释