蓝桥杯辅导视频学习-经典递归问题

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/J_1234567890/article/details/51838611

1、在n个球中,任意取出m个(不放回),求有多少种不同取法?

分析:(通过假设的方法把一个大问题分解成两个小问题)
假设已经把所有取法全都罗列出来了,又假如在这些球中有一个我喜欢的球1号,那么在这些所有的取法中, 有的取法中包含了球1号,有的没有包含。那么接下来把这些所有的取法分成两种类型,一种类型是这些取法中包含了球1号,另一种类型的取法中是不包含球1号的。
(1)球1号取:在剩下的 n-1 中取出 m - 1 个球就能满足要求了
get_ball( n - 1, m -1 )
(2)球1号不取:既然已经确定球1号不会被取走,那么也就是在剩下的 n - 1 个球中取出 m 个球来满足要求
get_ball( n - 1, m )

     寻找出口,停止递归:
     (1)从 n = 2个球中取出m = 3个球是不成立的,故 if (n < m)    return 0 ;
     (2)从 n = 2个球中取出 m = 2个球的取法只有一种,故 if ( n == m)   return 1 ;
     (3) get_ball( n - 1, m -1 )中 n 和 m 都在不停的减少, n 是大于 m 的(因为小于和等于的情况已经在上面被排除了),当m=0时,n可能是大于0的,比如从 n = 5 个球中取出 m = 0个球,那么只有一种取法,那就是什么都不取,故 if (m == 0)   return 1 ; 

这里写图片描述

2、求n个元素的全排列?

全排列:和组合不同。
分析
考虑问题从最简单的开始,如abc,acb,bca,bac,cab,cba。
每次都把一个元素放在头位置,剩下的元素进行全排列。
可以使用的一种方法,每次递归仅仅是当前位置的数组元素和后面其他元素进行交换位置。
第0个元素 < …. 每个元素
第1个元素 < …. 每个元素 ……

     举例:如有abcde个元素进行全排列,首先a <->b进行交换,得到bacde;然后进行递归调用,b不动,a <-> c进行交换,得到bcade;bc不动,a <-> d交换,得到bcdae;bcd不动,a <-> e交换,得到bcdea;这样就形成了层层递归。

当前位置的数组元素的位置信息(即第几个元素)作为递归调用的函数的一个参数,这样每次的当前交换位置都会变化,构造了相似性,使得递归调用不会每次都是完全相同的。

在进行这种递归分隔的时候,需要注意:如 a b c d e,在a \ c进行交换后,要把他们的位置重新换回来。若不换回来,会影响其后的计算,破坏递归开始的初始局面,结束递归的基准就不存在了。因此在结束时要进行回溯(十分重要)。

 【白话说明回溯】比如在a <-> e 交换之后得到bcdea,还会进行两次递归调用, 当for语句循环条件不成立时,则会层层返回,每次返回到上层递归时就要进行回溯。比如当再次回到得到bcdea的那一层递归时,接下来就要进行回溯,把在这一层交换的位置给换回来,即回到bcdae的状态,然后再返回到上一层递归,就不会影响上一层接下来的回溯执行。

递归的出口:
for( int i = k ; i < strlen(data) ; i++)因为这个循环语句中已经有了 i < strlen(data)为限制出口的条件。
何时打印:
当当前的交换位置已经移到最后一个元素,则应该进行输出,没必要在递归了。

这里写图片描述
这里写图片描述

3、求两个串的最大公共子序列的长度?

公共子序列:
如abcdef ,abc abd bdf ….都是abcdef 的子序列,但abcdef不是其本身的子序列。从串中随便取哪些元素组合成的新的串就是子序列。
用递归解决这个问题是可行的,但是效率不高。

     分析:设有两个字符串 s1和 s2,分别取两个字符串中的第一个字符 ch1 和 ch2。如果ch1 == ch2,那么只要求s1和s2中剩下的字符串中最大公共子序列的长度,再+1就是要求的结果。如果ch1 != ch2 , 那么把s1中除了第一个字符以外的剩下的字符和整个s2进行比较,得到最大公共子序列的长度 len1,再把s2中除了第一个字符以外的剩下的字符和整个s1进行比较(所谓的比较就是分别取出两个字符串中的第一个字符判断是否相等,递归调用),得到最大公共子序列的长度 len2,取 len1 和 len2 中的最大值。

递归出口:若两个字符串中有一个为0,则不需要再进行比较了,return 0 ;
这里写图片描述
这里写图片描述

4、求“cba”的反串“abc”。

构建递归的要诀:

  • 找到相似性
  • 定义出口
    这里写图片描述

5、在杨辉三角形中,计算第 m 层的第 n 个系数的计算方法。

这里写图片描述

扫描二维码关注公众号,回复: 3796670 查看本文章

运用这个递归,可以很方便的打印出杨辉三角。

这里写图片描述

6、计算m个A,n个B可以组合成多少个不同排列的问题。

  如计算3个A,2个B,可以组成多少种排列的问题(如AAABB,AABBA)。

  经验总结:
  当要处理一堆东西的时候,往往是把一堆东西中的某一个当成是特殊的,然后把这一堆分成两个部分进行处理。

这里写图片描述

7、整数n的划分问题。

  如对整数6进行划分, 6
                                    5+1
                                    4+2,4+1+1
                                    3+3,3+2+1,3+1+1+1
                                    2+2+2,2+2+1+1,2+1+1+1+1
                                    1+1+1+1+1+1

 分析:确定第一位,然后通过递归求后面的位数。
            5  .... f(1)
            4  .... f(2)  ……

猜你喜欢

转载自blog.csdn.net/J_1234567890/article/details/51838611
今日推荐