文档声明:
以下资料均属于本人在学习过程中产出的学习笔记,如果错误或者遗漏之处,请多多指正。并且该文档在后期会随着学习的深入不断补充完善。
资料仅供学习交流使用。
作者:Aliven888
1、简述
程序设计的关键就是算法,算法简单来说就是程序设计时问题解题步骤或者数据数据的流程。这里我们将介绍以下几种常用的算法:迭代法、穷举法、递推法、递归发、回溯法、贪婪法、查找算法、排序算法。
本章节主要介绍递归法。
2、递归法
递归:简单来说,函数的递归调用是指一个函数在它的函数体中直接或者间接自己调用自己。它是设计和描述算法的一种有力工具,它在复杂算法的描述中经常被采用;能采用递归算法的通常都有这样的特征:可以把复杂的逻辑按照一定的逻辑简化成一个简单算法的重复,当简化到规模最小时,就能得到答案了。
特点:
由于递归函数引起的递归调用,并且可能会有一系列的重复计算,所以递归算法的执行效率相对比较低。
代码实例:
//经典的汉诺塔问题:有若干个盘子由大到小一次放在塔A上,此时借助塔B,将盘子全部移到塔C上。
//条件:一次只能移动一个盘子,而且移动的过程中,大的盘子不能放小的盘子上面。
//题目分析:
// 递归的思路 :由最后的答案,反着一步步推理解题思路
//1、将n-1个盘子从塔A(借助于塔C)移动到塔B上,此时塔A上只有做大的那个盘子
//2、将最大的盘子由塔A移动到塔C上。
//3、将塔B上剩余的n-1个盘子(借助于塔A)移动到塔C上 —— 任务完成
//eg:
int step = 0; //移动步数
void move(int n, char a, char b, char c)
{
if (n > 0)
{
move(n - 1, a, c, b); //塔A借助于塔C全部移动到塔B上
step++;
cout << "第" << step << "步:移动" << a << " ---> " << c << endl; //移动最大的盘子
move(n - 1, b, a, c); //塔B借助于塔A全部移动到塔C上——成功。
}
}
void main()
{
move(4, 'A', 'B', 'C');
}
运行结果: