算法学习笔记-概念
计算机程序一般都是实现一种已有的方法来解决某个问题,与编程语言无关。算法描述了解决问题的步骤。
算法定义
算法就是:描述一种 有限、确定、有效并且适合用计算机程序来实现的解决问题的方法。
例子
自然语言描述:
计算两个非负整数的最大公约数(q&p):若q是0,则最大公约数是p。否则,将p除以q得到余数r,q和p的最大公约数即为q和r的最大公约数。
Java语言实现:
Public static int gcd(int p, int q)
{
if (q == 0) return p;
int r = p % q;
return gcd(q, r);
}
这里定义了方法 gcd,然后又在 gcd 中调用了 gcd,即一个方法调用本身,是使用了递归的办法将大问题不断分解为小问题,直到最后得出结果。使用递归减少了代码量。
Python实现:
#--coding=utf-8--
def gcd(p, q):
if q == 0:
return p #q为0的特殊情况
r = p % q #求p % q的余数
return gcd(q, r) #递归 调用本身
错误记录:
用Python实现这个算法的时候出现了一个错误——定义 gcd的时候把p和q的位置互换了,导致报错 -RuntimeError: maximum recursion depth exceeded 。在网上查了,发现python默认的递归深度是很有限的,大概是900多的样子,当递归深度超过这个值的时候,就会引发这样的一个异常。
我这里错误的原因是传入参数时出了问题,递归时导致无限递归,超过了递归深度,从而引发了异常。
要是遇到超多的递归怎么办?
解决办法是手动设置递归深度:
import sys
sys.setrecursionlimit(10000) #例如这里设置为一万
数据结构
大多数的算法都需要适当的组织数据,为了组织数据就产生了数据结构。数据结构与算法的关系非常密切。
算法的必要性
用计算机解决一个问题可以有若干种不同的方法,小型问题只要能解决问题,方法的不同没有什么关系,在解决大型问题的时候我们的时间和资源总是有限的,因此我们就需要设计能够高效利用时间和资源的方法。研究算法的原因主要是它能节约非常多的时间或者资源。
认真学习第一天,坚持就是胜利!!!