算法

递归算法

递归是非常重要的计算思维,基本原理就是将一个问题分解为同类的小问题。递归思想是基础计算机算法,分治思想,贪心算法,动态规划算法都是基于递归思想。

1.1欧几里得算法

用于求两个整数的最大公约数,又称辗转相除法。基本原理如下:两个正整数的最大公约数等于其中较小的数与两个数之差的最大公约数,基于此,其可以转化成求这两个数中较小的数和两数相除的余数的最大公约数,直至其余数变为0,这时最大公约数就是其中较小的那个数。

算法_第1张图片

 

1.2斐波那契数列

著名的兔子繁衍问题:如果一对兔子每月能生一对小兔(一雄一雌),而每对小兔在它们出生后的第三个 月里,又能开始生一对小兔,假定在不发生死亡的情况下,由一对出生的小兔开始,50 月 后会有多少对兔子?

该问题的分析:第一个月只有一对兔子,第二个月仍只有一对兔子,第三个月兔子对数 为第二个月兔子对数加第一月兔子新生的对数。同理,第 i 个月兔子对数为第 i-1 月兔子对 数 加 第 i-2 月兔子 新 生 的对数。即 从 第 一 个 月 开 始计算, 每月兔子 对 数 依 次 为 : 1,1,2,3,5,8,13,21,34,55,89,144,233,…

算法_第2张图片

 1.3汉诺塔问题

算法_第3张图片

 实现这个算法可以简单分为三个步骤:

(1)把 n-1 个盘子由 A 移到 B;

(2)把第 n 个盘子由 A 移到 C;

(3)把 n-1 个盘子由 B 移到 C;

我们不难发现,移到的步数必定为奇数 步:

(1)中间的一步是把最大的一个盘子由 A 移到 C 上去;

(2)中间一步之上可以看成把 A 上 n-1 个盘子通过借助辅助塔(C 塔)移到 了 B 上;

(3)中间一步之下可以看成把 B 上 n-1 个盘子通过借助辅助塔(A 塔)移到 了 C 上;

可得递归公式,,根据上述递归公示,得证 f(n) = 2*f(n-1) + 1 = 2*(2f(n-2)+1) + 1 = 4f(n-2) + 2 + 1 = 4(2f(n-3)+1)+2+1 = 8f(n-3)+4+2+1=…=2n -1

 1.4合并列表问题

问题描述:

利用递归思想解决如下问题:编写 merge(L1, L2)函数:输入参数是两个从 小到大排好序的整数列表 L1 和 L2,返回合成后的从小到大的大列表。

例如:merge([1,4,5], [3,7])会返回[1,3,4,5,7];merge([],[2,3,4])会返回[2,3,4].

要求: 1. 一定要用递归方式; 2. 只能用列表 append()和 len()函数。

算法原理介绍: L1[0]是 L1 这个列表中最小的,L2[0]是 L2 这个列表中最小的。比较这两个数,小的数 从列表中拿出来,将这个少一个数的列表和另一个列表作为递归调用的参数; 得到返回的已经排序好的列表后,将前面拿出来的那个较小的数放在这个返回列表的 最前面; 然后再返回这个排序好的列表。

递归终止条件:其中一个列表是空的。(如果 L1 为空,则返回 L2;否则返回 L1。

1.5选择排序

选择排序是一种最简单的排序思想。

它的工作原理是:首先在未排序序列中找到最小 (大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大) 元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。

选择排序是一种表现稳定的算法,其算法复杂度为 O(n2)。 n 个记录的直接选择排序可经过 n-1 趟直接选择排序得到有序结果。

具体算法描述如 下:

(1) 初始状态:无序区为 R[1..n],有序区为空;

(2) 第 i 趟排序(i=1,2,3…n-1)开始时,当前有序区和无序区分别为 R[1..i-1]和 R(i..n)。该 趟排序从当前无序区中-选出关键字最小的记录 R[k],将它与无序区的第 1 个记录 R 交换,使 R[1..i]和 R[i+1..n)分别变为记录个数增加 1 个的新有序区和记录个数减 少 1 个的新无序区;

(3) n-1 趟结束,数组排序完毕。

1.6分治算法

基本思想是把一个复杂问题分解成两个或更多的相同或相似的互相独立的子问题,再 把子问题分解成更小的子问题,直到最后的子问题可以简单直接求解。之后,将这些子问题 的解合并从而构造出原始规模的问题的解。

1.7贪心算法

贪心算法是我们最熟悉、最常用的方法。一般来说,求解最优化问题的过程就是做一系 列的决定从而实现最优值的过程。最优解就是实现最优值的这些决定。贪心算法考虑局部 最优,每次都做当下看起来最好的决策,因此得到的解不一定是全局最优解。虽然贪心算法 不一定能得到问题的最优解,但是对于某些实际问题,我们是可以通过贪心算法得到最优 解的。 在计算机科学中,得到的解是否是最优解是一个复杂的数学证明过程,在本次试验中 将暂时不做进一步讨论。

1.8动态规划

动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后再得出原问题的解。与分治法不同的是,适合于动态规划求解的问题,经 分解得到的子问题不是相互独立的,即子问题之间具有重叠的部分。这时如果使用分治法 就会对问题的重叠部分重复求解,而动态规划只会对这些重叠的部分求解一次,并建立表 格保存已经计算好的解,从而大大减少重复计算,提高算法效率。

你可能感兴趣的:(算法,贪心算法,动态规划)