1、迭代与递归的概述
在计算机编程中,递推关系可以通过递归或者迭代来实现,但是递归和迭代又不仅仅只能用来实现递推关,有更广泛的用途。
递推、递归和迭代都是解决问题的一种方法,它们三者之间有一定的联系。递归和迭代可以用于实现递推关系,但它们也有各自独立的应用场景。
1)递推
递推是一种通过重复计算较小的相似子问题来解决较大问题的方法。递推的关键思想是将原问题分解为一系列较小的相似子问题,然后通过计算子问题的解来得到原问题的解。
2)迭代
迭代是一种重复执行某些操作的方法,通过在每个迭代中更新变量来逐步解决问题。迭代可以用于实现递推关系。人们说的递推算法,实际指迭代算法。
3)递归
递归是一种函数调用自身的技术,通过将问题分解成相似的子问题来解决问题。在递归实现中,函数在其定义中调用自身,这样可以通过重复调用函数来解决问题。递归可以用于实现递推关系。
2、迭代释义
迭代即更替,迭代是重复反馈过程的活动,迭代目的是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。重复执行一系列运算步骤,从前面的量依次求出后面的量的过程。此过程的每一次结果,都是由对前一次所得结果施行相同的运算步骤得到的。
迭代是一种基本的方法,用于解决数学和计算机科学中的许多问题。在数学中,迭代法,也称为辗转法,是一种不断用变量的旧值推出新值的过程。这种方法与直接解决问题的方法(或称为一次解法)相对。
迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。
迭代法可以分为精确迭代和近似迭代,后者包括典型的迭代法如“二分法”和“牛顿迭代法”,主要用于求解非线性方程或寻找函数的最小值等。
1)迭代的应用
迭代算法是通过重复执行一系列操作来逐渐逼近问题的解。每一次对过程的重复称为一次“迭代”。对于编程技术,其中一组指令被重复执行,直到满足某个条件。迭代通常通过循环结构(如 for 循环或 while 循环)实现。
使用迭代法去直接计算10!(C )
#include<iostream>
using namespace std;
void text()
int sum = 1;
for (int i = 1; i <= 10; i )
sum *= i;
cout <<"10! = " << sum << endl;
int main()
text();
上述方法采用的是一种固定执行次数的迭代法,而当遇到一个无法一次用公式去求解,又不能要去确定将要执行多少次的情况,就需要去用到while循环。while循环必须去加入控制变量的起始值以及递增或递减的表达式,在编写该循环的过程中去检查离开循环体的条件是否存在。如果条件不存在,则会让循环去无限循环的执行下去。
迭代法(C )
#include<iostream>
using namespace std;
void text()
cout << "请输入要计算的阶乘数:";
int n; cin >> n;
int sum=1,i=1;
while (i <= n)
sum *= i;
cout <<n <<"! = " << sum << endl;
int main()
text();
迭代法(C )
迭代算法用Python实现:
2)关于迭代生活实例
按目前主流的生物进化论来说,生物的进化史,其实就很像一个迭代更新的过程。不同的生物在自己物种的基因下,经过长时间的生物变迁从而在基因和整体性状特征等等方面都会发生显著的变化。还有像在当今的互联网时代中,手机的更新过程就是一个迭代化的过程,通过这种迭代的方式对手机进行更新换代,从而不断地去完善技术突破并且满足不同用户群体的需求。
3)迭代法的典型案例,如开平方
在数学中,因为很多数的开平方都是无理数,所以我们需要借助数值计算的方式来进行近似值的求解。在数学中可以使用如下的迭代公式来求解a开平方的近似值:
迭代法求解开平方算法的操作步骤如下:
A、选定一个迭代初值x0,将其带入上面的迭代公式中求解出x1
B、计算x1-x0的绝对值,如果小于指定精度e,则退出迭代过程,否则继续迭代运算
C、将x(n)带入上面的迭代公式,求解出x(n 1)。继续判断x(n 1)-x(n)的绝对值,如果小于指定精度e,则退出迭代过程,否则继续迭代运算…
代码展示(C ):使用具体情况中的迭代公式法,去求解在精度0.000001下8的开平方值。
#include<iostream>
using namespace std;
class sqrtnum {
public:
void sqrt()
double t=0;
result = x;
while (abs(result - t) > e)
t = result;
result = 0.5 * (t x / t);
cout << "结果为:" <<result << endl;
double e; //精度
double x; //开平方数
double result; //迭代结果
void text()
sqrtnum sn;
cout << "请输入要开平方数:";
cin >> sn.x;
cout << "请输入开平方的精度数:";
cin >> sn.e;
sn.sqrt();
int main()
text();
补充:帕斯卡三角形也是采用迭代方式计算的!
4)迭代法的典型案例——计算了1到n的整数之和
迭代算法用c 实现:
迭代算法用python实现:
在计算机科学中,迭代算法利用计算机运算速度快和适合做重复性操作的特点,通过构造序列来求问题的近似解。例如,对于非线性方程,可以通过递推关系式从初始值开始计算,逐步逼近方程的解。迭代法在线性和非线性方程组求解、最优化计算及特征值计算等问题中被广泛应用。
此外,迭代计算在数值计算中是一类典型的方法,应用于方程求根、方程组求解、矩阵求特征值等方面。其基本思想是逐次逼近,先取一个粗糙的近似值,然后用同一个递推公式反复校正此初值,直至达到预定精度要求为止。
总的来说,迭代是一种重要的数学和计算机科学概念,通过不断重复的过程来逼近问题的解或达到某个目标状态
3、递归释义
递归,在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。简单来说,递归表现为函数调用函数本身。在知乎看到一个比喻递归的例子,个人觉得非常形象,大家看一下:
❝递归最恰当的比喻,就是查词典。我们使用的词典,本身就是递归,为了解释一个词,需要使用更多的词。当你查一个词,发现这个词的解释中某个词仍然不懂,于是你开始查这第二个词,可惜,第二个词里仍然有不懂的词,于是查第三个词,这样查下去,直到有一个词的解释是你完全能看懂的,那么递归走到了尽头,然后你开始后退,逐个明白之前查过的每一个词,最终,你明白了最开始那个词的意思。❞
实际上,递归有两个显著的特征,终止条件和自身调用:
1)自身调用:原问题可以分解为子问题,子问题和原问题的求解方法是一致的,即都是调用自身的同一个函数。
2)终止条件:递归必须有一个终止的条件,即不能无限循环地调用本身。
结合以上demo代码例子,看下递归的特点:
为了更容易理解一些,我们来看一下 函数sum(n=5)的递归执行过程,如下:
计算sum(5)时,先sum(5)入栈,然后原问题sum(5)拆分为子问题sum(4),再入栈,直到终止条件sum(n=1)=1,就开始出栈。
sum(1)出栈后,sum(2)开始出栈,接着sum(3)。
最后sum(1)就是后进先出,sum(5)是先进后出,因此递归过程可以理解为栈出入过程。
递归法的典型案例——计算1到n的整数之和
递归算法用C 实现:
递归算法用Python实现代码:
4、迭代与递归的区别
迭代和递归的主要区别在于它们的定义、结构、时间复杂度、用法以及无限重复的后果。
首先,迭代和递归的定义如下:
迭代是利用已知的变量值,通过不断更新变量的值来解决问题的方法。迭代通常涉及循环结构,每次迭代都会更新状态,直到达到结束条件。
递归则是函数直接或间接调用自身,直到满足终止条件后再逐层返回的过程。递归通常用于将大问题分解为小问题,通过小问题的解决来逐步解决大问题。
1)在结构上,迭代通常表现为环状结构,通过循环来不断更新状态直到达到结束条件。而递归则表现为树状结构,通过不断地[递推]和“回归”来解决问题。
2)时间复杂度方面,迭代的时间复杂度通常较低,因为迭代通常涉及较少的函数调用,而递归的时间复杂度可能较高,特别是当递归层次较深时,时间复杂度可能呈指数级增长。
3)用法上,迭代适用于需要重复执行相同操作的情况,而递归则适用于可以将问题分解为更小、更易于处理的部分的情况。迭代通常涉及较大的代码量,但时间复杂度较低;而递归虽然代码量较小,但时间复杂度较高。
举例:计算斐波那契数列
斐波那契数列(Fibonacci Sequence):斐波那契数列是指从 0 和 1 开始,后面的每一项都是前两项之和。也就是说,第 n 个斐波那契数等于第 n-1 个斐波那契数与第 n-2 个斐波那契数的和。斐波那契数列的前几项依次为:0, 1, 1, 2, 3, 5, 8, 13, 21, ..。可以使用递归或迭代的方式来生成斐波那契数列。
递归算法用C 实现(关键代码):
int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n - 1) fibonacci(n - 2);
在这个例子中,fibonacci(n)函数通过递归调用自身来计算斐波那契数列的第n项。基本情况是n <= 1,此时函数返回n。在递归情况下,函数返回fibonacci(n - 1) fibonacci(n - 2),这是斐波那契数列的定义。
递归算法用Python实现(关键代码):
def fibonacci(n):
if n <= 1:
return n
else:
return fibonacci(n - 1) fibonacci(n - 2)
迭代算法用C 实现(关键代码):
int fibonacci(int n) {
if (n <= 0) {
return n;
} else {
int a = 0, b = 1, c;
for (int i = 2; i <= n; i ) {
c = a b;
a = b;
b = c;
return b;
迭代算法用Python实现(关键代码):
def fibonacci(n):
if n <= 0:
return n
else:
a, b = 0, 1
for _ in range(2, n 1):
a, b = b, a b
return b
最后,无限重复的后果也不同。迭代中可能会因为条件判断错误导致无限循环,但这通常不会导致程序崩溃;而递归中可能会因为基本条件设置错误导致无限递归,最终可能导致系统资源耗尽或崩溃。
正如梭罗在《瓦尔登湖》里曾说:“有些人为什么步伐与众不同呢?那是因为他们听到了远方的鼓声。”持续地学习,持续地创新。不断学习迭代的组织,不断地开发新的内容,开发新的知识体系,一直紧跟时代的脚步。”虞锋说过,我们做投资人最关心的就是如何创新,如何跟得上这个时代最新的技术和商业模式,跟踪最棒的一批创业者。