C语言迭代法详细讲解

合集下载

C语言迭代法详细讲解

C语言迭代法详细讲解

迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。

迭代法又分为精确迭代和近似迭代。

“二分法”和“牛顿迭代法”属于近似迭代法。

迭代算法是用计算机解决问题的一种基本方法。

它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:一、确定迭代变量。

在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。

所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。

迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。

在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。

不能让迭代过程无休止地重复执行下去。

迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。

对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

例 1 :一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。

如果所有的兔子都不死去,问到第12 个月时,该饲养场共有兔子多少只?分析:这是一个典型的递推问题。

我们不妨假设第 1 个月时兔子的只数为u 1 ,第 2 个月时兔子的只数为u 2 ,第 3 个月时兔子的只数为u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有u 1 = 1 ,u 2 =u 1 +u 1 ×1 = 2 ,u 3 =u 2 +u 2 ×1= 4 ,……根据这个规律,可以归纳出下面的递推公式:u n =u n - 1 × 2 (n ≥ 2)对应u n 和u n - 1 ,定义两个迭代变量y 和x ,可将上面的递推公式转换成如下迭代关系:y=x*2x=y让计算机对这个迭代关系重复执行11 次,就可以算出第12 个月时的兔子数。

c语言迭代法自洽计算简单举例

c语言迭代法自洽计算简单举例

c语言迭代法自洽计算简单举例迭代法是一种常用的数值计算方法,特别适用于需要反复迭代求解的问题。

在C语言中,我们可以通过循环来实现迭代计算。

下面我将列举10个简单的例子,来说明如何使用C语言迭代法进行自洽计算。

1. 求解平方根:假设我们需要计算一个数的平方根,可以使用迭代法来逼近平方根的值。

我们可以从一个初始值开始,通过不断迭代计算来逼近平方根的真实值。

2. 求解方程的根:对于一元方程 f(x) = 0,我们可以使用迭代法来求解方程的根。

通过不断迭代计算,我们可以逼近方程的根的值。

3. 计算圆周率:圆周率是一个无理数,它的值可以使用迭代法进行计算。

通过不断迭代计算,我们可以逼近圆周率的真实值。

4. 计算斐波那契数列:斐波那契数列是一个经典的数列,可以使用迭代法来计算。

通过不断迭代计算,我们可以得到斐波那契数列的前n个数。

5. 计算阶乘:阶乘是一个常见的数学运算,可以使用迭代法来计算。

通过不断迭代计算,我们可以得到给定数的阶乘值。

6. 求解最大公约数:最大公约数是两个数的公共因子中最大的一个,可以使用迭代法来求解。

通过不断迭代计算,我们可以得到两个数的最大公约数。

7. 求解矩阵乘法:矩阵乘法是一种常见的数学运算,可以使用迭代法来计算。

通过不断迭代计算,我们可以得到两个矩阵的乘积。

8. 求解线性方程组:线性方程组是一组线性方程的集合,可以使用迭代法来求解。

通过不断迭代计算,我们可以得到线性方程组的解。

9. 进行排序算法:排序算法是一种常见的算法,可以使用迭代法来实现。

通过不断迭代计算,我们可以将一组数据按照一定的规则进行排序。

10. 进行图像处理:图像处理是一种常见的应用领域,可以使用迭代法来实现。

通过不断迭代计算,我们可以对图像进行增强、滤波等操作。

以上是我列举的10个使用C语言迭代法进行自洽计算的简单例子。

通过这些例子,我们可以看到迭代法在数值计算中的广泛应用。

希望这些例子能够帮助你更好地理解和应用迭代法。

c语言中的6种基本语句中迭代语句

c语言中的6种基本语句中迭代语句

C语言中的6种基本语句中迭代语句一、概述C语言是一种高效而灵活的编程语言,它提供了丰富的语法和功能以满足程序员的需求。

在C语言中,有6种基本类型的语句,它们分别是赋值语句、选择语句、循环语句、跳转语句、函数调用语句和空语句。

其中,循环语句是程序中常用的一种语句类型,用于重复执行某段代码块。

本文将重点介绍C语言中的循环语句,探讨其特点、用法和实例。

二、C语言中的迭代语句在C语言中,迭代语句是一种循环语句,用于多次执行相同的代码块。

C语言提供了3种用于实现迭代的语句,它们分别是while语句、do...while语句和for语句。

接下来,我们将分别介绍这3种迭代语句的特点和用法。

1. while语句while语句是C语言中最简单的一种迭代语句,其基本语法如下:```while (condition) {// 循环体}```其中,condition是一个逻辑表达式,用于判断是否继续执行循环体。

具体的执行过程是,首先计算condition的值,如果为真则执行循环体,然后再次计算condition的值,重复这个过程直到condition的值为假为止。

while语句的执行逻辑可用下图表示:```判断condition是否为真↓condition为真 --> 执行循环体 --> 再次判断condition是否为真↓ ↓condition为真 --> 执行循环体 --> 再次判断condition是否为真... ...↓ ↓condition为假 --> 结束循环```下面是一个使用while语句的简单例子,该例子用于计算1到10的累加和:```int sum = 0;int i = 1;while (i <= 10) {sum += i;i++;}```在这个例子中,while语句的循环条件是i <= 10,只要满足这个条件,就会执行循环体sum += i; i++;。

C语言三种方法求阶乘

C语言三种方法求阶乘

C语言三种方法求阶乘在C语言中,有多种方法可以计算阶乘。

下面将介绍三种常见的方法,包括迭代法、递归法和递推法。

1.迭代法:迭代法是一种基本的计算阶乘的方法,它通过循环结构来实现。

具体实现方式如下:```c#include <stdio.h>unsigned long long factorial_iterative(int n)unsigned long long result = 1;for (int i = 1; i <= n; i++)result *= i;}return result;int maiint n;printf("请输入一个整数:");scanf("%d", &n);unsigned long long result = factorial_iterative(n);printf("%d的阶乘为:%llu\n", n, result);return 0;```这段代码中,我们定义了一个`factorial_iterative`函数,它接受一个整数参数`n`,使用循环结构来计算`n`的阶乘。

在`main`函数中,接受用户输入的整数`n`,然后调用`factorial_iterative`函数来计算阶乘,并输出结果。

2.递归法:递归法是一种通过调用自身的方式来实现的方法。

具体实现方式如下:```c#include <stdio.h>unsigned long long factorial_recursive(int n)if (n == 0)return 1;} elsereturn n * factorial_recursive(n - 1);}int maiint n;printf("请输入一个整数:");scanf("%d", &n);unsigned long long result = factorial_recursive(n);printf("%d的阶乘为:%llu\n", n, result);return 0;```这段代码中,我们定义了一个`factorial_recursive`函数,它接受一个整数参数`n`。

常用算法(一)——迭代法

常用算法(一)——迭代法

常用算法——迭代法一、迭代法迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。

设方程为f(x)=0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,xn-1)设方程组为:xi=gi(X) (I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{ for (i=0;i<n;i++)x=初始近似根;do {for (i=0;i<n;i++)y=x;for (i=0;i<n;i++)x=gi(X);for (delta=0.0,i=0;i<n;i++)if (fabs(y-x)>delta) delta=fabs(y-x);} while (delta>Epsilon);for (i=0;i<n;i++)printf(“变量x[%d]的近似根是%f”,I,x);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

C语言中的迭代与迭代器

C语言中的迭代与迭代器

C语言中的迭代与迭代器迭代(Iteration)是程序中常用的一种控制流程方式,它让程序能够重复执行一段代码块,从而达到对一组数据或集合进行处理的目的。

在C语言中,迭代常常与循环语句结合使用,例如for循环和while循环。

迭代器(Iterator)则是一种辅助工具,它提供了对数据集合中元素进行遍历和访问的方法。

C语言中的迭代主要通过循环语句来实现。

常见的循环语句有for循环、while循环和do-while循环。

它们都允许程序重复执行一段代码块,直到满足某个终止条件。

首先,我们来看看for循环。

for循环由一个初始化表达式、一个循环条件表达式和一个迭代表达式组成。

其中,初始化表达式在循环开始前执行一次,循环条件表达式在每次迭代前进行判断,如果为真则执行循环体,执行完循环体后再执行迭代表达式。

下面是for循环的一般形式:```cfor (初始化表达式; 循环条件表达式; 迭代表达式) {// 循环体}```接下来是while循环和do-while循环。

while循环只有一个循环条件表达式,它在每次迭代前进行判断,如果为真则执行循环体。

而do-while循环则是先执行一次循环体,然后再进行循环条件的判断,如果为真则继续执行循环体,否则循环结束。

下面是它们的一般形式:```cwhile (循环条件表达式) {// 循环体}do {// 循环体} while (循环条件表达式);```这些循环语句可以让我们在程序中重复执行一段代码块,实现对数据的迭代处理。

但是有时我们可能需要更灵活、更高级的迭代方式,这就引入了迭代器的概念。

迭代器是一种抽象的数据类型,它提供了一组接口,用于遍历和访问数据集合中的元素。

在C语言中,我们可以利用指针来实现迭代器的功能。

通过定义一个指针,我们可以按照一定的规则遍历数组或其他数据结构中的元素。

以数组为例,我们可以通过指针来遍历数组中的元素。

假设有一个整型数组arr,我们可以定义一个指针p指向数组的第一个元素,并通过不断移动指针的位置来遍历整个数组。

C语言复习---迭代法,牛顿迭代法,二分法求根

C语言复习---迭代法,牛顿迭代法,二分法求根

C语⾔复习---迭代法,⽜顿迭代法,⼆分法求根⼀:⽤迭代法求 x=√a。

求平⽅根的迭代公式为:X(n+1)= (Xn+a/Xn) /2。

#define _CRT_SECURE_NO_WARNINGS#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){double x1, x2;float a;scanf("%f", &a);x2 = 1.0;do{x1 = x2;x2 = (x1 + a / x1) / 2;} while (fabs(x1-x2)>pow(10,-5));printf("value:%lf", x2);system("pause");return0;}⼆:⽤求⽅程在1.5附近的根(2x3-4x2+3x-6=0)例:⽅程求根⽜顿迭代法求⽅程 f(x)=x3+x2-3x-3=0在1.5附近的根f(x)=x^3+x^2-3x-3f'(x)=3x^2+2x-3x(n+1)=xn-f(xn)/f'(xn)令x1=1.5x2=1.777778x3=1.733361x4=1.732052x5=1.732051x6=1.732051如果精确到0.000001,则x=1.732051准确值=根号3重要公式#include <stdio.h>#include <stdlib.h>#include <math.h>int main(){double x1=0, x2;double fx1, fx2;x2 = 1.5;while (fabs(x1 - x2)>=1e-6){x1 = x2;fx1 = 2 * x1*x1*x1 - 4 * x1*x1 + 3 * x1 - 6; //f(xn)fx2 = 6 * x1*x1 - 8 * x1 + 3; //f(xn)'x2 = x1 - fx1 / fx2;}printf("value:%lf", x2);system("pause");return0;}三:⼆分法求⽅程的根给定精确度ξ,⽤⼆分法求函数f(x)零点近似值的步骤如下:1确定区间[a,b],验证f(a)·f(b)<0(这是前提,选取的区间必须满⾜这个条件),给定精确度ξ. 2求区间(a,b)的中点c.3计算f(c).(1) 若f(c)=0,则c就是函数的零点;(2) 若f(a)·f(c)<0,则令b=c;(3) 若f(c)·f(b)<0,则令a=c.(4) 判断是否达到精确度ξ:即若|a-b|<ξ,则得到零点近似值a(或b),否则重复2-4.#include <stdio.h>#include <stdlib.h>#include <math.h>double fx(double x){return2 * x*x*x - 4 * x*x + 3 * x - 6;}int main(){double x1 , x2;double fx1, fx2;double e = 1e-6;do{printf("enter (x1,x2):\n");scanf("%lf", &x1);scanf("%lf", &x2);if (x1>x2){double temp = x1;x1 = x2;x2 = temp;}fx1 = fx(x1);fx2 = fx(x2);} while (fx1*fx2>0);if (fabs(fx1) < e)printf("solution1:%lf\n", x1);else if (fabs(fx2) < e)printf("solution2:%lf\n", x2);else{while (fabs(x1 - x2) >= e){double mid = (x1 + x2) / 2;if (fx(mid)*fx2 < 0)x1 = mid;elsex2 = mid;}printf("solution3:%lf", x2);}system("pause");return0;}。

迭代法求方程的根c语言

迭代法求方程的根c语言

迭代法求方程的根c语言迭代法求方程的根是数学中一种非常实用的方法,它通过反复逼近来得到方程的根。

对于许多复杂的方程,迭代法可以提供一种更加简单有效的求解方式。

在计算机中,使用C语言可以轻松地实现迭代法求方程的根。

迭代法基础迭代法是一种数值分析中常用的计算方法,它通过在初始条件下反复施加同一运算,来逐渐逼近目标值的过程。

简单的迭代法可以用下面的公式进行表示:Xn+1 = f(Xn)其中,Xn是第n次迭代的结果,Xn+1是下一次迭代的结果,f(Xn)是在当前值下计算得到的函数值。

这个公式可以反复使用,以达到逐步逼近目标值的效果。

例如,在求解方程f(x) = 0时,可以使用下面的迭代公式:Xn+1 = Xn - f(Xn)/f’(Xn)其中,f’(Xn)表示f(Xn)的导数,也就是函数在Xn 处的切线斜率。

这个公式可以通过在Xn处求出函数值和导数,计算出下一次迭代的Xn+1值。

实现迭代法求方程的根要使用迭代法求解方程的根,需要首先定义迭代函数f(x)以及其导数f’(x)。

这里我们以求解方程x^2 - 2x -1 = 0为例,f(x) = x^2 - 2x - 1,f’(x) = 2x - 2。

在C语言中,我们可以使用以下代码定义迭代函数和其导数:double f(double x) { return x*x - 2*x -1; }double fder(double x) { return 2*x - 2; }接下来,我们可以使用以上定义的迭代函数和导数,使用下面的代码实现迭代法求方程的根:double iterative(double x0, int n){ double x = x0; int i = 0; while(i<n) { x = x - f(x)/fder(x); i++; } return x; }其中x0为迭代的初始值,n为迭代的次数。

在迭代过程中,我们可以使用while循环来反复使用迭代公式,来一步一步逼近方程的根。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

迭代法迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。

迭代法又分为精确迭代和近似迭代。

“二分法”和“牛顿迭代法”属于近似迭代法。

迭代算法是用计算机解决问题的一种基本方法。

它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

利用迭代算法解决问题,需要做好以下三个方面的工作:一、确定迭代变量。

在可以用迭代算法解决的问题中,至少存在一个直接或间接地不断由旧值递推出新值的变量,这个变量就是迭代变量。

二、建立迭代关系式。

所谓迭代关系式,指如何从变量的前一个值推出其下一个值的公式(或关系)。

迭代关系式的建立是解决迭代问题的关键,通常可以使用递推或倒推的方法来完成。

三、对迭代过程进行控制。

在什么时候结束迭代过程?这是编写迭代程序必须考虑的问题。

不能让迭代过程无休止地重复执行下去。

迭代过程的控制通常可分为两种情况:一种是所需的迭代次数是个确定的值,可以计算出来;另一种是所需的迭代次数无法确定。

对于前一种情况,可以构建一个固定次数的循环来实现对迭代过程的控制;对于后一种情况,需要进一步分析出用来结束迭代过程的条件。

例 1 :一个饲养场引进一只刚出生的新品种兔子,这种兔子从出生的下一个月开始,每月新生一只兔子,新生的兔子也如此繁殖。

如果所有的兔子都不死去,问到第12 个月时,该饲养场共有兔子多少只?分析:这是一个典型的递推问题。

我们不妨假设第 1 个月时兔子的只数为u 1 ,第 2 个月时兔子的只数为u 2 ,第 3 个月时兔子的只数为u 3 ,……根据题意,“这种兔子从出生的下一个月开始,每月新生一只兔子”,则有u 1 = 1 ,u 2 =u 1 +u 1 × 1 = 2 ,u 3 =u 2 +u 2 × 1 =4 ,……根据这个规律,可以归纳出下面的递推公式:u n =u n - 1 × 2 (n ≥ 2)对应u n 和u n - 1 ,定义两个迭代变量y 和x ,可将上面的递推公式转换成如下迭代关系:y=x*2x=y让计算机对这个迭代关系重复执行11 次,就可以算出第12 个月时的兔子数。

参考程序如下:clsx=1for i=2 to 12y=x*2x=ynext iprint yend例 2 :阿米巴用简单分裂的方式繁殖,它每分裂一次要用 3 分钟。

将若干个阿米巴放在一个盛满营养参液的容器内,45 分钟后容器内充满了阿米巴。

已知容器最多可以装阿米巴220,220个。

试问,开始的时候往容器内放了多少个阿米巴?请编程序算出。

分析:根据题意,阿米巴每 3 分钟分裂一次,那么从开始的时候将阿米巴放入容器里面,到45 分钟后充满容器,需要分裂45/3=15 次。

而“容器最多可以装阿米巴2^ 20 个”,即阿米巴分裂15 次以后得到的个数是2^20 。

题目要求我们计算分裂之前的阿米巴数,不妨使用倒推的方法,从第15 次分裂之后的2^20 个,倒推出第15 次分裂之前(即第14 次分裂之后)的个数,再进一步倒推出第13 次分裂之后、第12 次分裂之后、……第 1 次分裂之前的个数。

设第 1 次分裂之前的个数为x 0 、第 1 次分裂之后的个数为x 1 、第 2 次分裂之后的个数为x 2 、……第15 次分裂之后的个数为x 15 ,则有x 14 =x 15 /2 、x 13 =x 14 /2 、…… x n-1 =x n /2 (n ≥ 1)因为第15 次分裂之后的个数x 15 是已知的,如果定义迭代变量为x ,则可以将上面的倒推公式转换成如下的迭代公式:x=x/2 (x 的初值为第15 次分裂之后的个数2^20 )让这个迭代公式重复执行15 次,就可以倒推出第 1 次分裂之前的阿米巴个数。

因为所需的迭代次数是个确定的值,我们可以使用一个固定次数的循环来实现对迭代过程的控制。

参考程序如下:clsx=2^20for i=1 to 15x=x/2next iprint xendps:java中幂的算法是Math.pow(2, 20);返回double,稍微注意一下例 3 :验证谷角猜想。

日本数学家谷角静夫在研究自然数时发现了一个奇怪现象:对于任意一个自然数n ,若n 为偶数,则将其除以 2 ;若n 为奇数,则将其乘以 3 ,然后再加 1 。

如此经过有限次运算后,总可以得到自然数 1 。

人们把谷角静夫的这一发现叫做“谷角猜想”。

要求:编写一个程序,由键盘输入一个自然数n ,把n 经过有限次运算后,最终变成自然数 1 的全过程打印出来。

分析:定义迭代变量为n ,按照谷角猜想的内容,可以得到两种情况下的迭代关系式:当n 为偶数时,n=n/2 ;当n 为奇数时,n=n*3+1 。

用QBASIC 语言把它描述出来就是:if n 为偶数thenn=n/2elsen=n*3+1end if这就是需要计算机重复执行的迭代过程。

这个迭代过程需要重复执行多少次,才能使迭代变量n 最终变成自然数 1 ,这是我们无法计算出来的。

因此,还需进一步确定用来结束迭代过程的条件。

仔细分析题目要求,不难看出,对任意给定的一个自然数n ,只要经过有限次运算后,能够得到自然数 1 ,就已经完成了验证工作。

因此,用来结束迭代过程的条件可以定义为:n=1 。

参考程序如下:clsinput "Please input n=";ndo until n=1if n mod 2=0 thenrem 如果n 为偶数,则调用迭代公式n=n/2n=n/2print "—";n;elsen=n*3+1print "—";n;end ifloopend迭代法开平方:#include<stdio.h>#include<math.h>void main(){double a,x0,x1;printf("Input a:\n");scanf("%lf",&a);//为什么在VC6.0中不能写成“scanf("%f",&a);”?if(a<0)printf("Error!\n");else{x0=a/2;x1=(x0+a/x0)/2;do{x0=x1;x1=(x0+a/x0)/2;}while(fabs(x0-x1)>=1e-6);}printf("Result:\n");printf("sqrt(%g)=%g\n",a,x1);}求平方根的迭代公式:x1=1/2*(x0+a/x0)。

算法:1.先自定一个初值x0,作为a的平方根值,在我们的程序中取a/2作为a 的初值;利用迭代公式求出一个x1。

此值与真正的a的平方根值相比,误差很大。

2.把新求得的x1代入x0中,准备用此新的x0再去求出一个新的x1.3.利用迭代公式再求出一个新的x1的值,也就是用新的x0又求出一个新的平方根值x1,此值将更趋近于真正的平方根值。

4.比较前后两次求得的平方根值x0和x1,如果它们的差值小于我们指定的值,即达到我们要求的精度,则认为x1就是a的平方根值,去执行步骤5;否则执行步骤2,即循环进行迭代。

迭代法是用于求方程或方程组近似根的一种常用的算法设计方法。

设方程为f(x) =0,用某种数学方法导出等价的形式x=g(x),然后按以下步骤执行:(1)选一个方程的近似根,赋给变量x0;(2)将x0的值保存于变量x1,然后计算g(x1),并将结果存于变量x0;(3)当x0与x1的差的绝对值还小于指定的精度要求时,重复步骤(2)的计算。

若方程有根,并且用上述方法计算出来的近似根序列收敛,则按上述方法求得的x0就认为是方程的根。

上述算法用C程序的形式表示为:【算法】迭代法求方程的根{ x0=初始近似根;do {x1=x0;x0=g(x1);/*按特定的方程计算新的近似根*/} while ( fabs(x0-x1)>Epsilon);printf(“方程的近似根是%f\n”,x0);}迭代算法也常用于求方程组的根,令X=(x0,x1,…,xn-1)设方程组为:xi=gi(X) (I=0,1,…,n-1)则求方程组根的迭代算法可描述如下:【算法】迭代法求方程组的根{ for (i=0;ix=初始近似根;do {for (i=0;iy=x;for (i=0;ix=gi(X);for (delta=0.0,i=0;iif (fabs(y-x)>delta) delta=fabs(y-x);} while (delta>Epsilon);for (i=0;iprintf(“变量x[%d]的近似根是%f”,I,x);printf(“\n”);}具体使用迭代法求根时应注意以下两种可能发生的情况:(1)如果方程无解,算法求出的近似根序列就不会收敛,迭代过程会变成死循环,因此在使用迭代算法前应先考察方程是否有解,并在程序中对迭代的次数给予限制;(2)方程虽然有解,但迭代公式选择不当,或迭代的初始近似根选择不合理,也会导致迭代失败。

递归递归是设计和描述算法的一种有力的工具,由于它在复杂算法的描述中被经常采用,为此在进一步介绍其他算法设计方法之前先讨论它。

能采用递归描述的算法通常有这样的特征:为求解规模为N的问题,设法将它分解成规模较小的问题,然后从这些小问题的解方便地构造出大问题的解,并且这些规模较小的问题也能采用同样的分解和综合方法,分解成规模更小的问题,并从这些更小问题的解构造出规模较大问题的解。

特别地,当规模N=1时,能直接得解。

【问题】编写计算斐波那契(Fibonacci)数列的第n项函数fib(n)。

斐波那契数列为:0、1、1、2、3、……,即:fib(0)=0;fib(1)=1;fib(n)=fib(n-1)+fib(n-2) (当n>1时)。

写成递归函数有:int fib(int n){ if (n==0) return 0;if (n==1) return 1;if (n>1) return fib(n-1)+fib(n-2);}递归算法的执行过程分递推和回归两个阶段。

在递推阶段,把较复杂的问题(规模为n)的求解推到比原问题简单一些的问题(规模小于n)的求解。

例如上例中,求解fib(n),把它推到求解fib(n-1)和fib(n-2)。

也就是说,为计算fib(n),必须先计算f ib(n-1)和fib(n- 2),而计算fib(n-1)和fib(n-2),又必须先计算fib(n-3)和fib(n-4)。

相关文档
最新文档