【算法设计zxd】第3章 迭代法 杨辉三角,穿越沙漠,内存移动,竖式相乘(阶乘)

目录

迭代:(辗转法)        一种 不断用变量的旧值递推新值的过程

【例3-1】 输出如图的杨辉三角形。

【例3-2】穿越沙漠问题

【例3-2】内存移动问题

【例3-4】编程求当n<=100时,n!的准确值。

代码


迭代法:(辗转法)
        一种 不断用变量的旧值递推新值的过程

分类:

  •         精确迭代:杨辉三角,内在移动算法
  •         近似迭代:二分法和牛顿迭代法

设计方法:

  • 确定迭代模型
  • 控制迭代过程 

 递推方程:

 

例子:

斐波那契:

 

换元迭代:

 例如二路归并

 解的正确性——验证:数学归纳法

差消法化简高阶递推方程:_化简为一阶方程再求解

快排

输入情况:

每个输入, 划分的比较次数都是n-1。(每个元素都要跟首元素进行比较)

工作量总和:(比较次数)

 平均工作量:

 差消化简:

 

 

【例3-1】 输出如图的杨辉三角形

问题分析:


存储:A[n,n]矩阵

矩阵:A = {a0,0,a1,0,a1,1,…,ai,0,…,ai,i,…,an-1,n-1} 

//元素之间的关系:ai,j=ai-1,j-1+ai-1,j 即当前元素的值,是由上一层同列和上一层同列左侧的元素相加得到。

计算模型:

算法设计与描述 算法分析
输入: n  (1)输入n ,规模为n
输出:杨辉三角

Yanghui(n)

{

        a[0,0] <- 1,a[1,0]<-1 ,a[1,1]<-1; //3 

        for i <- 2 to n-1 do

        {

                a[i,0]<- 1 ;a[i,i] <- 1; //2 

                for j<- 1 to i-1 do

                        a[i,j] <- a[i-1,j-1]+a[i-1,j]; // 1

        }

        output(a);

}

(2)核心操作:a[i,j] <- a[i-1,j-1]+a[i-1,j]的加法运算及两边的值

(3)依据定理2.5算法的时间复杂度为 

杨辉三角与斐波那契数列:

【例3-2】穿越沙漠问题

用一辆吉普车穿越 1000公里的沙漠。吉普车的总装油量为 500 升,耗油率为 1 升/公里。由于沙漠中没有油库,必须先用这辆车在沙漠中建立临时油库。
该吉普车以最少的耗油 量穿越沙漠,应在什么地方建油库,以及各处的贮油量。

// 1.车到达终点时油箱是空的。2.路上的每一个中转点都没有剩下油。

分析:
用倒推法来解决, 加油站n加油站n+1 倒推(离终点远):吉普车在两加油站之间往返若干次,每次返回n+1时正好耗尽500升油,每次从n+1出发时装满500升,两点之间的距离必须满足在耗油最少的条件下,使n点存储n*500升汽油。
第1加油站:距离终点500公里,储存500升汽油oil[1]=500,以保证车能从1到达0(终点)。
第2加油站:为了在加油站1存储500升,车需要加油站的500和路上的500,oil[2]=500*2=1000。一总往返是3次。三次往返路程的耗油量按最省 为500升,dis(2)-dis(1)=500/3 km。【第一次走:装了500 走了500/3 车剩下2*500/3的油,在加油站存储500/3。返回:车500/3油,返回后无剩余。第二次走:装500 耗500/3 剩余500/3*2  放入加油站500/3*2 此时加油站有500L】

从i-1点往i点运油时,最节省的情况是从i-1点出发时应该油箱装满油,然后在i点放下油后回到i-1点时油箱是空的,这时候运油的效率是最高的。

第3加油站:为了在加油站2存储2*500升,oil[3]=500*3=1500,一总往返是5次。五次往返路程的耗油量按最省 为500升,dis(3)-dis(2)=500/5 km=100km。
第i加油站:为了在加油站i-1存储(i-1)*500升,oil[i]=500*i,一总往返是(2*i+1)次。dis(i)-dis(2i-1)=500/(2*i+1) km。

计算模型:
设起点到终点距离为distance,终点到加油站的距离为dis,加 油站的油量为oil,加油站编号为
n,计算模型如下:
  • dis1=500        //终点到第一加油站的距离
  • oil1=500        //第一加油站的油量
  • dis(n)= dis(n-1) + 500/(2*n-1)    约束:dis(n-1)<distance  //终点到第n加油站的距离 = 
  • oil(n) = oil(n-1)+500        //下一个加油站的油量多500 也可以用500*i
算法设计与描述 算法分析
输入: distance (1)输入distance 
输出:每个加油站的油量 及 到终点的距离 规模 distance 与n 

Desert ( distance )

{

     dis <- 500,oil <- 500,n <- 1;
    while dis<distance do
    {
        output(n,dis,oil);
        n <- n+1;
        oil <- oil+500;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值