递推公式

转:一文学会递归解题

独自空忆成欢 提交于 2020-02-22 15:53:40
前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少是不能接受的,如果发现算出的时间复杂度过大,则需要转换思路,看下是否有更好的解法 ,这才是根本目的,不要为了递归而递归! 本文试图从以下几个方面来讲解递归 什么是递归? 递归算法通用解决思路 实战演练(从初级到高阶) 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结一套很通用的求解递归时间复杂度的套路,相信你看完肯定会有收获 什么是递归 简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。 以阶乘函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数 public int factorial ( int n ) { if ( n < = 1 ) {

阿牛的EOF牛肉串(递推公式的推导)

怎甘沉沦 提交于 2020-01-13 21:53:21
今年的ACM暑期集训队一共有18人,分为6支队伍。其中有一个叫做EOF的队伍,由04级的阿牛、XC以及05级的COY组成。在共同的集训生活中,大家建立了深厚的友谊,阿牛准备做点什么来纪念这段激情燃烧的岁月,想了一想,阿牛从家里拿来了一块上等的牛肉干,准备在上面刻下一个长度为n的只由"E" “O” "F"三种字符组成的字符串(可以只有其中一种或两种字符,但绝对不能有其他字符),阿牛同时禁止在串中出现O相邻的情况,他认为,"OO"看起来就像发怒的眼睛,效果不好。 你,NEW ACMer,EOF的崇拜者,能帮阿牛算一下一共有多少种满足要求的不同的字符串吗? PS: 阿牛还有一个小秘密,就是准备把这个刻有 EOF的牛肉干,作为神秘礼物献给杭电五十周年校庆,可以想象,当校长接过这块牛肉干的时候该有多高兴!这里,请允许我代表杭电的ACMer向阿牛表示感谢! 再次感谢! Input 输入数据包含多个测试实例,每个测试实例占一行,由一个整数n组成,(0<n<40)。 Output 对于每个测试实例,请输出全部的满足要求的涂法,每个实例的输出占一行。 Sample Input 1 2 Sample Output 3 8 递推公式推导 有了递推公式,而且知道f(1),f(2); 结果大家就会求了吧。 # include <bits/stdc++.h> using namespace std ; int

【Java】递归递推的应用

喜夏-厌秋 提交于 2019-12-20 00:28:09
利用阶乘公式来计算组合式: 程序设计思想: 根据公式来计算组合数的大小,从键盘输入n,k的值,设计一个计算阶乘的大小,如果输入的数a为1或0,则直接return 1,否则运用递归,计算a-1的阶乘,直到a为1时,递归结束。 程序流程图: 程序源代码: public static void main(String args[]) { int n ,k,c; Scanner in=new Scanner(System.in); System.out.print("输入从n个数中选k个数中n,k的值:"); n=in.nextInt(); k=in.nextInt(); System.out.println("结果为:"); c=jiecheng(n)/(jiecheng(k)*jiecheng(n-k)); System.out.println(c); } public static int jiecheng(int x) {   int y=1;   if(x==1||x==0)   y=1;   else y=jiecheng(x-1)*x;   return y; } 根据杨辉三角递推求组合数 程序设计思想: 根据杨辉三角的规律,得出杨辉三角的第n行的第m个的值等于该位置的元素的上一行的左右两个输的和,然后根据杨辉三角与组合数的关系即c(n,m)等于杨辉三角的第n+1的第m

一文教你学会递归解题

↘锁芯ラ 提交于 2019-12-06 23:48:32
前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少是不能接受的,如果发现算出的时间复杂度过大,则需要转换思路,看下是否有更好的解法 ,这才是根本目的,不要为了递归而递归! 本文试图从以下几个方面来讲解递归 什么是递归? 递归算法通用解决思路 实战演练(从初级到高阶) 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结一套很通用的求解递归时间复杂度的套路,相信你看完肯定会有收获 什么是递归 简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。 以阶乘函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数 public int factorial(int n) { if (n < =1) { return 1;

一文学会递归解题!

懵懂的女人 提交于 2019-12-06 07:14:09
前言 递归是算法中一种非常重要的思想,应用也很广,小到阶乘,再在工作中用到的比如统计文件夹大小,大到 Google 的 PageRank 算法都能看到,也是面试官很喜欢的考点 最近看了不少递归的文章,收获不小,不过我发现大部分网上的讲递归的文章都不太全面,主要的问题在于解题后大部分都没有给出相应的时间/空间复杂度,而时间/空间复杂度是算法的重要考量!递归算法的时间复杂度普遍比较难(需要用到归纳法等),换句话说,如果能解决递归的算法复杂度,其他算法题题的时间复杂度也基本不在话下。另外,递归算法的时间复杂度不少是不能接受的,如果发现算出的时间复杂度过大,则需要转换思路,看下是否有更好的解法 ,这才是根本目的,不要为了递归而递归! 本文试图从以下几个方面来讲解递归 什么是递归? 递归算法通用解决思路 实战演练(从初级到高阶) 力争让大家对递归的认知能上一个新台阶,特别会对递归的精华:时间复杂度作详细剖析,会给大家总结一套很通用的求解递归时间复杂度的套路,相信你看完肯定会有收获 什么是递归 简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。 以阶层函数为例,如下, 在 factorial 函数中存在着 factorial(n - 1) 的调用,所以此函数是递归函数 public int factorial(int n) { if (n < =1) { return 1;

如何教会女友递归算法?

与世无争的帅哥 提交于 2019-12-05 06:05:00
一到周末就开始放荡自我,这不带着女朋友去万达电影院看电影(其实是由于整天呆在家敲代码硬是 被女朋友强行拖拽去看电影,作为一个有理想的程序员,我想各位应该都能体谅我),一到电影院, 女朋友说要买爆米花和可乐,我当时二话没说,臣本布衣躬耕于南阳,壤中羞涩,所以单买了爆米 花,买完都不带回头看老板的那种,饮料喝多了不好,出门的时候我带了白开水,还得亏我长得销 魂,乍一看就能看出是个社会精神小伙,女朋友也没多说什么,只是对我微了微笑(我估计是被我的 颜值以及独到的见解所折服),刚坐下没多久,女朋友突然问我,咱们现在坐在第几排啊?电影院里 面太黑了,看不清,没法数,这个时候,如果是你现在你怎么办?别忘了你我是程序员,这个可难不 倒我,递归就开始排上用场了。于是我就问前面一排的人他是第几排,你想只要在他的数字上加一, 就知道自己在哪一排了。但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前 问,直到问到第一排的人,说我在第一排,然后再这样一排一排再把数字传回来。直到你前面的人告 诉你他在哪一排,于是你就知道答案了。这就是一个非常标准的递归求解问题的分解过程,去的过程 叫“递”,回来的过程叫“归”。基本上,所有的递归问题都可以用递推公式来表示。我们用递推公式将 它表示出来就是这样的 f ( n ) = f (n - 1) + 1 其中,f ( 1 ) = 1 f(n

数据结构与算法之美学习笔记:第十讲

≡放荡痞女 提交于 2019-12-04 02:13:45
一、开篇问题 推荐注册返佣金的这个功能我想你应该不陌生吧?现在很多App都有这个功能。这个功能中,用户A推荐用户B来注册,用户B又推荐了用户C来注册。我们可以说,用户C的“最终推荐人”为用户A, 用户B的“最终推荐人”也为用户A,而用户A没有“最终推荐人”。 一般来说,我们会通过数据库来记录这种推荐关系。在数据库表中,我们可以记录两⾏数据,其中actor_id表示用户id,referrer_id表示推荐人id。 基于这个背景,我的问题是, 给定一个用户ID,如何查找这个用户的“最终推荐人”? 带着这个问题,我们来学习今天的内 容,递归(Recursion) 二、如何理解递归 1、电影院案例 周末你带着女朋友去电影院看电影,女朋友问你,咱们现在坐在第几排啊?电影院里面太黑了,看不清,没法数,现在你怎么办? 2、用递归解决你在第几排的问题 别忘了你是程序员,这个可难不倒你,递归就开始排上用场了: 于是你就问前面一排的人他是第几排,你想只要在他的数字上加一,就知道自己在哪一排了。 但是,前面的人也看不清啊,所以他也问他前面的人。就这样一排一排往前问,直到问到第一排的人,说我在第一排, 然后再这样一排一排再把数字传回来。直到你前面的人告诉你他在哪几排,于是你就知道答案了。 这就是一个非常标准的递归求解问题的分解过程: 去的过程叫“递”,回来的过程叫“归” 。基本上

卡特兰数的递推公式推导

走远了吗. 提交于 2019-11-30 19:40:06
今天做acm题时碰到了卡特兰数,于是就上百度查了卡特兰数的解释,其中有这么一段: 出栈次序 一个 栈 (无穷大)的 进栈 序列为1,2,3,…,n,有多少个不同的 出栈 序列? 常规分析 首先,我们设f(n)=序列个数为n的出栈序列种数。同时,我们假定,从开始到栈第一次出到空为止,这段过程中第一个出栈的序数是k。特别地,如果栈直到整个过程结束时才空,则k=n 首次出空之前第一个出栈的序数k将1~n的序列分成两个序列,其中一个是1~k-1,序列个数为k-1,另外一个是k+1~n,序列个数是n-k。 此时,我们若把k视为确定一个序数,那么根据乘法原理,f(n)的问题就等价于——序列个数为k-1的出栈序列种数乘以序列个数为n - k的出栈序列种数,即选择k这个序数的f(n)=f(k-1)×f(n-k)。而k可以选1到n,所以再根据加法原理,将k取不同值的序列种数相加,得到的总序列种数为:f(n)=f(0)f(n-1)+f(1)f(n-2)+……+f(n-1)f(0)。 看到此处,再看看卡特兰数的递推式,答案不言而喻,即为f(n)=h(n)= C(2n,n)/(n+1)= c(2n,n)-c(2n,n+1)(n=0,1,2,……)。 最后,令f(0)=1,f(1)=1。 其中提到首次出空之前第一个出栈的序数k,k把序列分成了1~k-1和k+1~n两个部分,把k作为序数时f(n)=f(k-1