算法学习(二):递归算法与分治算法

1、递归

1.1、什么是递归

递归指的是一种通过重复将原问题分解为同类的子问题而解决的方法。简单来说就是在运行的过程中,直到碰到终止条件,然后再返回结果的过程。

基本思想就是:把规模大的问题不断分解为形式相同的子问题来解决。

由上述可以知道,可以把递归分为两个过程:[递推过程][回归过程]

递推过程:就是将本来的问题一层层的分解为与原问题形式相同,规模更小的子问题,直到达到结束条件时停止,然后返回底层的解。

回归过程:从最底层子问题的解开始,一层一层的回归,最后回到最开始递推的原问题,最后返回原问题的解。

1.2、递归的适用范围

由递归的基本思想可以得到,一个问题若是需要用递归需满足三大要求

① 该问题是否可以分解为规模更小的子问题?

② 该问题的子问题的求解思路是否与原问题相同?

③ 若满足上述两点,则需考虑递归的终止条件是什么?(一个没有终止条件的递归,就是一个死循环。)

1.3、递归的解题思路

在写递归的时候,可以按照递归的基本思想来写,可以将递归的解题思路分为三步

① 写出递推公式:找到将原问题分解为子问题的规律,并且根据规律写出递推公式。

② 明确终止条件:推敲出递归的终止条件,以及递归终止时的处理方法。

③ 将递推公式和终止条件翻译为代码

Ⅰ.定义递归函数:明确函数意义、传入参数、返回结果等。

Ⅱ.书写递归主体:提取重复的逻辑,缩小问题规模。

Ⅲ.明确递归终止条件:给出递归的终止条件,以及递归终止时的处理方法。

1.4、递归算法的应用

来讲讲大家应该都听过的斐波那契数

题目内容:

斐波那契数 (通常用 F(n) 表示)形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:

F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1

给定 n ,请计算 F(n) 。


题目示例:

输入:n = 4
输出:3
解释:F(4) = F(3) + F(2) = 2 + 1 = 3

解题思路:

① 写出递推公式:观察原问题,可以发现其分解为子问题的规律,确定出递推公式。F(n) = F(n-1) + F(n-2)。

② 明确终止条件:题目内容给出的F(0) = 0,F(1) = 1。

③ 翻译为递归代码:

Ⅰ.定义递归函数:fibonacci(int n),传入的参数为int型的n,n代表问题的规模,返回的内容是第n个斐波那契数。

Ⅱ.书写递归主体:return fibonacci(n - 1) + fibonacci(n - 2).

Ⅲ.明确递归终止条件:明确终止条件 if (n == 0 || n == 1) { return 1; }

代码如下:

public static int fibonacci(int n){
    if (n == 0 || n == 1) {             //终止条件
        return 1;
    }
    if (n > 2) {
        return fibonacci(n - 1) + fibonacci(n - 2);     //递归调用
    }
    return -1;              //如果输入错误的n,一律返回-1
}

1.5、递归算法的题目

二叉树的最大深度

爬楼梯

2、分治:

2.1、什么是分治

分治可以理解为分而治之,就是把一个复杂的问题分为两个或两个以上相同或相似的子问题,直到最后子问题可以简单的直接求解,原问题的解为子问题解的合并。

基本思想就是:把规模大的问题不断分解为子问题,使得问题规模减小到可以直接求解为止。(注意和递归的区别哦)

2.2、分治和递归的异同

由上可知,两个算法都是将规模大的问题不断分解为子问题。那么两者又有什么异同呢?递归其实和分治之间存在一种包含关系,即递归算法 ∈ 分治算法。

2.3、分治的适用范围

需要用分治算法解决的问题,需要满足四个条件

① 可分解:原问题可以分解为若干个规模较小的相同子问题。

② 子问题可独立求解:分解出来的子问题可以独立求解,即子问题之间不包含公共的子子问题。

③ 具有分解的终止条件:当问题的规模足够小时,能够用较简单的方法解决。

④ 可合并:子问题的解可以合并为原问题的解,并且合并操作的复杂度不能太高,否则就无法起到减少算法总体复杂度的效果了。

2.4、分治的解题思路

需要用分治算法解决的问题分为三个步骤

① 分解:把要解决的问题分解为成若干个规模较小、相对独立、与原问题形式相同的子问题。

② 求解:递归求解各个子问题。

③ 合并:按照原问题的要求,将子问题的解逐层合并构成原问题的解。

2.5、分治算法的题目

排序数组

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
递归分治算法是计算机科学中常用的算法设计方法,它们通常用于解决复杂的问题。在算法设计实验中,我们可以通过分析递归分治算法的性能以及实现过程来更深入地理解它们的原理和应用。 下面是针对递归分治算法设计实验的分析: 1. 算法实现:在实验中,我们需要实现递归分治算法递归算法通常包含一个基本情况和一个递归情况。基本情况是结束递归的条件,而递归情况是通过调用自己来解决问题。分治算法通常包含三个步骤:分解问题、解决问题和合并结果。在分解问题的过程中,将原问题划分为若干个子问题,然后递归地解决子问题。在解决问题的过程中,对每个子问题进行求解。在合并结果的过程中,将子问题的结果合并成原问题的解。 2. 算法性能:在分析算法性能时,我们需要考虑算法的时间复杂度和空间复杂度。递归算法的时间复杂度通常与递归深度有关,而分治算法的时间复杂度通常与问题规模有关。空间复杂度通常与算法递归深度和使用的数据结构有关。在实验中,我们可以通过比较递归分治算法的时间复杂度和空间复杂度来评估它们的性能。 3. 算法应用:递归分治算法在实际应用中都有广泛的应用。递归算法适用于具有递归结构的问题,例如树和图。分治算法适用于可以分解为若干个子问题的问题,例如排序、查找和计算几何等问题。在实验中,我们可以通过应用递归分治算法来解决不同类型的问题,例如叉树的遍历、归并排序和最近点对问题等。 总之,递归分治算法是计算机科学中非常重要的算法设计方法。通过实验,我们可以更好地理解它们的原理和应用,并且能够更加深入地研究算法的性能和实现过程。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值