除开计算机程序外,迭代的含义就是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
而对计算机特定程序中需要反复执行的子程序*(一组指令),进行一次重复,即重复执行程序中的循环,直到满足某条件为止,亦称为迭代。
这其实就很像愚公移山,移除大山就是愚公想要的完成的心愿,目标,愚公移除不了大山,他的儿子就来移除,儿子不行孙子来,孙子不行,重孙子来。。。直到完成愚公的心愿。
=============================分割线====================================
递归:是一种程序运行时调用自身的编程技巧,是一种在程序设计中广泛应用的算法。
它就是将大问题化为同类型的,类似的简化版的小问题来解决。
递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。
一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。
其中调用时产生一种递归关系,递归关系就是实体自己和自己建立关系。
构成递归需具备的条件:
1. 子问题须与原始问题为同样的事,且更为简单;
2. 不能无限制地调用本身,须有个出口,化简为非递归状况处理。
数学中典型的就是斐波那契数列,规律就是从第3个数开始,每个数都等于它前两个数的和。
阶乘(1) = 1 [基本情况] 对所有n > 1的整数:阶乘(n) = (n * 阶乘(n-1)) [递归定义] 一种便于理解的心理模型,是认为递归定义对对象的定义是按照“先前定义的”同类对象来定义的。
如此的定义在数学中十分常见。例如,集合论对自然数的正式定义是:1是一个自然数,每个自然数都有一个后继,这一个后继也是自然数。
java实例:
public static int recursion(int n){
if (n == 1 || n == 2) { //由于F(n)=F(n - 1)+F(n - 2)
//所以我将 1 和 2 分别拿出来分开判断
return 1;
}
if (n > 2) {
return recursion(n - 1) + recursion(n - 2); //调用recursion自身:递归开始
}
return -1; //如果输入的n不符合递归要求,返回错误-1
}
递归的缺点:
递归算法解题相对常用的算法如普通循环等,运行效率较低。因此,应该尽量避免使用递归,除非没有更好的算法或者某种特定情况,递归更为适合的时候。在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等。
递归的使用:
但不能不说递归不能使用了。
它能解决
(1)数据的定义是按递归定义的。(Fibonacci函数)
(2)问题解法按递归算法实现。
这类问题虽则本身没有明显的递归结构,但用递归求解比迭代求解更简单,如Hanoi问题。
(3)数据的结构形式是按递归定义的。
如二叉树、广义表等,由于结构本身固有的递归特性,则它们的操作可递归地描述。
如何设计递归算法
1.确定递归公式
2.确定边界(终了)条件
关于喜欢研究算法的小伙伴我总结一份递归例题:
练习:
用递归的方法完成下列问题
初级-中级
1.求数组中的最大数
2.1+2+3+...+n
3.求n个整数的积
4.求n个整数的平均值
5.求n个自然数的最大公约数与最小公倍数
6.有一对雌雄兔,每两个月就繁殖雌雄各一对兔子.问n个月后共有多少对兔子
7.已知:数列1,1,2,4,7,13,24,44,...求数列的第 n项.
高级:使用递归进行快速排序。
思路:先从数据序列中选一个元素,并将序列中所有比该元素小的元素都放到它的右边或左边,再对左右两边分别用同样的方法处之直到每一个待处理的序列的长度为1,处理结束.
题目:
计算ackerman函数值:
n+1 m=0
ack(m,n)={ ack(m-1,1) m<>0,n=0
ack(m-1,ack(m,n-1)) m<>0,n<>0
求ack(5,4)
注:该文为自己理解所写,若有错误,请私聊纠正。感谢!!
文章部分来自百度,csdn其他文章引用,若有版权问题,请私聊。