1. while
和do-while
循环的使用方法:
while
循环是一个常见且基础的循环,通常在给定约束条件的情况下使用,使用方法为:
while(exp) //无分号
loop-body;
其中
exp
表示执行循环语句时需要满足的条件loop-body
表示满足条件是执行的语句
汉语读法为:当满足exp
的时候,执行loop-body
它的好兄弟do-while
循环,在适用范围与其基本类似,唯一的区别在于do-while
循环先执行再判断,需要执行至少一次,使用方法为:
do
{
loop-body;
}while(exp); //有分号
汉语读法为:执行loop-body
,直到不满足exp
【注意顺序带来的差别】
2. 两个例子:
2.1 通过迭代法开平方根:
**已知:**平方根迭代满足如下公式:
x
n
+
1
=
1
2
(
x
n
+
a
x
n
)
x_{n+1} = \dfrac{1}{2}\left(x_{n}+\dfrac{a}{x_{n}}\right)
xn+1=21(xn+xna)
其中
x
0
=
a
2
x_{0} = \dfrac{a}{2}
x0=2a,求解代码如下:
#include <stdio.h>
int main()
{
const double ERROW = 1e-6; //误差精度(const 表示常量)
double delta;
double a, xn1, xn2; //迭代变量
scanf("%lf", &a);
xn2 = a/2;
do
{
xn1 = xn2; //保存xn2的值
xn2 = 0.5 * (xn1 + a / xn1); //迭代
if (xn2 > xn1) //通过条件语句实现绝对值
delta = xn2 - xn1;
else
delta = xn1 - xn2;
} while (delta > ERROW);
printf("%.3lf", xn2);
return 0;
}
2.2 通过牛顿迭代法求方程的根:
**已知:**设
x
k
x_{k}
xk是方程
f
(
x
)
=
0
f(x) = 0
f(x)=0的精确解
x
∗
x^{*}
x∗周围的一个点,过点
P
k
(
x
k
,
f
(
x
k
)
)
P_{k}(x_{k},f(x_{k}))
Pk(xk,f(xk))做切线,改切线方程为
y
=
f
(
x
k
)
+
f
′
(
x
k
)
(
x
−
x
k
)
y = f(x_{k})+f'(x_{k})(x-x_{k})
y=f(xk)+f′(xk)(x−xk)
切线与
x
x
x轴的交点为
x
k
+
1
x_{k+1}
xk+1,可以知道
x
k
+
1
x_{k+1}
xk+1逐渐逼近精确解
x
∗
x^{*}
x∗,计算机求解代码如下:
#include <stdio.h>
#include <math.h>
#define ESP 1e-7 //也可以用define:注意中间没有“=” 末尾没有“;”
int main()
{
double x2, x1;
double f, df;
x1 = 0;
do
{
f = pow(x1, 4) - 4 * pow(x1, 3) + 6 * pow(x1, 2) - 8 * x1 - 8;
df = 4 * pow(x1, 3) - 12 * pow(x1, 2) + 12 * x1 - 8;
x2 = x1 - f / df; //切线方程的根
x1 = x2;
} while (fabs(f) >= ESP); //通过标准库函数实现绝对值
printf("%.3lf\n", x2);
return 0;
}
3. 总结与反思:
所谓的迭代法,通常可以用while
循环来实现,其主要难点在于理清楚迭代的变量之间的相互关系。只要知道迭代公式,按照迭代公式的顺序进行书写,直到形成闭环即可。