【算法设计zxd】第一章 算法基础 4.设计工具【三角矩阵,】
目錄
1. 循環(huán)設(shè)計(jì)
(1) 設(shè)計(jì)思維
自底向上的設(shè)計(jì)(Down - Top Design)
自頂向下的設(shè)計(jì)(Top-Down Design)
(2)挖掘內(nèi)在規(guī)律構(gòu)建計(jì)算模型
【例1-3】設(shè)計(jì)算法,輸出一個(gè)n×n的三角矩陣,如圖所示規(guī)律。
? 問(wèn)題分析:
計(jì)算模型:?
?算法設(shè)計(jì)與描述:
?算法分析:
算法實(shí)現(xiàn):
(3)改進(jìn)計(jì)算模型提高運(yùn)算效率
【例1-4】?
?問(wèn)題分析 ? ? ?
計(jì)算模型
算法設(shè)計(jì)與描述 ? ? ?
算法實(shí)現(xiàn):
2. 遞歸設(shè)計(jì)
遞歸設(shè)計(jì)的步驟:
【1-5】運(yùn)用遞歸方式設(shè)計(jì)求解斐波那契數(shù)列(Fibonacci sequence)的第n項(xiàng)的值
計(jì)算模型
算法分析
?3.循環(huán)與遞歸的比較
【例1-5】任意給定十進(jìn)制數(shù):(1)從低位到高位逐位輸出各位數(shù)字; (2) 從高位到低位逐位輸出各位數(shù)字。
問(wèn)題分析
算法實(shí)現(xiàn)
?
【例1-6】求從n個(gè)自然數(shù)(1,2,3,…, n)中取出r個(gè)數(shù)的所有組合。
?計(jì)算模型:1)循環(huán)算法:
2)遞歸
?算法實(shí)現(xiàn)
【1-7】找出n個(gè)自然數(shù)(1,2,3,…, n)中取出r個(gè)數(shù)的所有組合。
算法分析
算法設(shè)計(jì)與描述
?比較總結(jié):
1. 循環(huán)設(shè)計(jì)
(1) 設(shè)計(jì)思維
自底向上的設(shè)計(jì)(Down - Top Design)
先找出某個(gè)問(wèn)題的子問(wèn)題或若干特殊問(wèn)題,
以定性、定量的方式去描述和解決這些子問(wèn)題,
然后,逐步合并子問(wèn)題的解,最后得到大問(wèn)題的解。
核心本質(zhì):合并
自頂向下的設(shè)計(jì)(Top-Down Design)
將復(fù)雜的大問(wèn)題分解為相對(duì)簡(jiǎn)單的小問(wèn)題,
找出每個(gè)問(wèn)題的關(guān)鍵、重點(diǎn)所在,
然后用精確的思維定性、定量地去描述問(wèn)題和解決問(wèn)題。
核心本質(zhì):分解。
例如:歸并算法:自頂向下拆,自底向上合并
(2)挖掘內(nèi)在規(guī)律構(gòu)建計(jì)算模型
挖掘問(wèn)題的內(nèi)在規(guī)律,進(jìn)行抽象并構(gòu)建計(jì)算模型
交通指揮燈:數(shù)據(jù)構(gòu)造
三角矩陣:運(yùn)算規(guī)律
運(yùn)算規(guī)律:一般找下標(biāo)對(duì)應(yīng)規(guī)律 最快
【例1-3】設(shè)計(jì)算法,輸出一個(gè)n×n的三角矩陣,如圖所示規(guī)律。
行列參與運(yùn)算(下標(biāo))
? 問(wèn)題分析:
問(wèn)題:要找到按斜行訪問(wèn)與按矩陣訪問(wèn)之間的映射關(guān)系?
計(jì)算模型:
?算法設(shè)計(jì)與描述:
輸入:矩陣行列值n
輸出:按斜行元素值為連續(xù)整數(shù)的三角矩陣
?算法分析:
算法主體語(yǔ)句執(zhí)行次數(shù)為:
?其中,L代表斜行,j代表列。
【其實(shí)是每一個(gè)元素都進(jìn)行操作,且只進(jìn)行一次。所以執(zhí)行次數(shù)=元素個(gè)數(shù)】
【第一斜行n 第二斜行......】
算法實(shí)現(xiàn):
#include<stdio.h>int main()
{// 輸入 int n,k=1;int a[100][100];printf("請(qǐng)輸入n值:");scanf("%d",&n);for(int L=0;L<n;L++)//L是斜行 {for(int j=0;j<n-L ;j++){a[L+j][j] = k++ ;}}//輸出for(int i=0;i<n;i++){for(int j=0;j<=i;j++){printf("%5d",a[i][j]);}printf("\n");} return 0;
}
思考題:n=5*5?
代碼:
#include<iostream>
using namespace std;int main()
{int n=5*5;int k=0;int a[n][n];for (int i=0;i<n;i++){for(int j=0;j<n-i;j++){a[i+j][j]=k++;}}for(int i=0;i<n;i++){for(int j=0;j<=i;j++)//注意這里是<= {cout<<a[i][j]<<" ";}cout<<endl;}return 0;
}
結(jié)果:
?
0 0 1
0 1 2
0 2 3
0 3 4
1 0 5
1 1 6
1 2 7
2 0 8
2 1 9
3 0 10
1
5 2
8 6 3
10 9 7 4
(3)改進(jìn)計(jì)算模型提高運(yùn)算效率
【例1-4】求1/1!-1/3!+1/5!-1/7!+…+(-1)n+1/(2*n-1)!
① 問(wèn)題分析? ? ? (運(yùn)算過(guò)濾)
迭代方法是在累乘的基礎(chǔ)上實(shí)現(xiàn)累加
②計(jì)算模型
?中間項(xiàng)
③算法設(shè)計(jì)與描述 ? ? ?
|
依據(jù)式(4-1)設(shè)計(jì)的算法EA |
依據(jù)式(4-2)設(shè)計(jì)的算法EA_G |
||
|
輸入? |
計(jì)算范圍n |
||
|
輸出 |
累加結(jié)果S |
||
|
算法 描述 |
step?1:?讀入n,令S=T=1、i=3、j=1,n=2*n-1 step?2:?判斷i<=n,成立T=1轉(zhuǎn)step3,?否則進(jìn)入step?6 step?3:?判斷j<=i,成立轉(zhuǎn)step?4,?否則進(jìn)入step5 step?4:?執(zhí)行T=T*j,?j=j+1;?轉(zhuǎn)step?3; step?5:?計(jì)算T的符號(hào); step?6:?S=S+1/T;?i=i+2;?轉(zhuǎn)step?2; step?7:?輸出S,運(yùn)算結(jié)束。 |
step?1:?讀入n,令S=T=1、i=3,n=2*n-1 step?2:?判斷i<=n,成立轉(zhuǎn)step3,?否則進(jìn)入step?5 step?3:?T=(-1)*T*(i-1)*i; step?4:?S=S+1/T;?i=i+2;?轉(zhuǎn)step?2; step?5:?輸出S,運(yùn)算結(jié)束。 |
|
| 3 4是內(nèi)層循環(huán) | 少去內(nèi)層循環(huán) | ||
④算法分析(缺)
⑤算法實(shí)現(xiàn):
EA
// EA
#include<stdio.h>
int main()
{float s=1.0f,t;int n,count=2;//項(xiàng)數(shù)printf("請(qǐng)輸入計(jì)算項(xiàng)數(shù):");scanf("%d",&n);for(int i=3;i<=2*n-1;i+=2){t=1.0f;//每次都重新算for(int j=2;j<=i;j++)//分母{t=t*j; }for(int j=1;j<=count+1;j++){t=-t;}s=s+ 1/t;count++;}printf("s=%f\n",s);
}
?EA_G?
// EA _ G
#include<stdio.h>
int main()
{float s=1.0f,t=1.0f;int n;printf("請(qǐng)輸入計(jì)算項(xiàng)數(shù):");scanf("%d",&n);for(int i=3;i<=2*n-1;i+=2){t= -t*(i-1)*i;//計(jì)算分母 s=s+ 1/t;}printf("s=%f\n",s);
}
⑥測(cè)試
⑦結(jié)果整理與文件編制
2. 遞歸設(shè)計(jì)
定義:一個(gè)過(guò)程或函數(shù)在定義中直接或間接調(diào)用自身的一種方法。
設(shè)計(jì)關(guān)鍵:找出遞歸關(guān)系(方程)和遞歸終止(邊界)條件。遞歸關(guān)系就是使問(wèn)題向邊界條件轉(zhuǎn)化的規(guī)則。
遞歸設(shè)計(jì)的步驟:
(1) 分析問(wèn)題找到遞歸關(guān)系:找出大規(guī)模問(wèn)題與小規(guī)模問(wèn)題的關(guān)系,以便通過(guò)遞歸使問(wèn)題規(guī)模變小。(收斂的)
(2)設(shè)置終止條件控制遞歸:通過(guò)停止條件的設(shè)置,找出可解的最小規(guī)模問(wèn)題。
(3)設(shè)計(jì)函數(shù)確定數(shù)據(jù)傳遞方式。
【1-5】斐波那契的第n項(xiàng) 遞歸
運(yùn)用遞歸方式設(shè)計(jì)求解斐波那契數(shù)列(Fibonacci sequence)的第n項(xiàng)的值
計(jì)算模型
遞歸的終止條件和遞歸方程,如下:
其中,式(5-2)是遞歸方程,式(5-1)是終止條件。
算法分析
?依據(jù)計(jì)算模型,容易得知,求第n項(xiàng)的值需要計(jì)算n-2次,所以,主體算法計(jì)算次數(shù)約為f(n)=n-2
斐波那契:算法實(shí)現(xiàn) C
#include<stdio.h> int fcc(int n)
{int t;if(n==1|n==2)return 1;else return fcc(n-1)+fcc(n-2);
}
int main()
{int n;printf("input n:");scanf("%d",&n);printf("No.%d value of Fibonacci sequence is %d\n ",n,fcc(n));return 0;
}
?3.循環(huán)與遞歸的比較
每個(gè)迭代算法原則上總可以轉(zhuǎn)換成與它等價(jià)的遞歸算法;
反之則不然,
就是說(shuō)不是每個(gè)遞歸算法都可以轉(zhuǎn)換成與它等價(jià)的循環(huán)結(jié)構(gòu)算法。
?
【例1-5】任意給定十進(jìn)制數(shù):(1)從低位到高位逐位輸出各位數(shù)字; (2) 從高位到低位逐位輸出各位數(shù)字。
問(wèn)題分析
這是一個(gè)較為簡(jiǎn)單的問(wèn)題,我們將從實(shí)現(xiàn)的角度來(lái)比較兩者對(duì)于問(wèn)題的適應(yīng)性。
算法實(shí)現(xiàn)
(1)從低位到高位:效率實(shí)際一樣
(2)從高位到低位:循環(huán)首先需要確定位數(shù),遞歸——聯(lián)系到樹(shù)的先根遍歷和中 后
改變要求,遞歸變化可能極小
思考題:嘗試總結(jié) 遞歸與循環(huán) 的優(yōu)缺點(diǎn)?
思考題:用遞歸求出斐波那契數(shù)列 去除重復(fù)計(jì)算
#include<iostream>
using namespace std;
//遞歸
int fb(int i)
{if(i==1||i==2)return 1;else return fb(i-1)+fb(i-2);
}
//時(shí)間復(fù)雜度O(2^n)
//空間復(fù)雜度O(1) //數(shù)組,去重,用空間換時(shí)間
int a[40];
int fib(int n)
{a[0]=0;a[1]=1;for(int i=2;i<=n;i++){a[i]=a[i-1]+a[i-2];}return a[n];
}
//時(shí)間O(n)
//空間O(n) //動(dòng)態(tài)規(guī)劃
int fibdp(int n)
{int f=0;int fp=1;while(n--){fp=fp+f;//規(guī)則 f=fp-f;//恢復(fù)fplus }return f;
}
//時(shí)間O(n)
//空間O(1)
int main()
{cout<<fb(12)<<endl;return 0;
}
代碼:
?
#include<iostream>
using namespace std;void gaocir(int n)
{int b[20];int i=0;while(n){b[i]=n%10;n=n/10;i++;}while(i--){cout<<" "<<b[i]''}
}
void gaodg(int n)
{if(n<10)cout<<" "<<n;else{gaodg(n/10);cout<<" "<<n%10;}
}
void dicir(int n)
{cout<<"低位開(kāi)始 循環(huán)";while(n){cout<<" "<<n%10;n=n/10;}
}
void didg(int n)
{
// cout<<"低位開(kāi)始 遞歸";if(n<10)cout<<" "<<n;else { cout<<" "<<n%10;didg(n/10);}
}
int main()
{int n=12345;return 0;
}
【例1-6】求從n個(gè)自然數(shù)(1,2,3,…, n)中取出r個(gè)數(shù)的所有組合。
問(wèn)題分析
?計(jì)算模型:
1)循環(huán)算法:
設(shè)i代表第i個(gè)位置,則 r 個(gè)位置上的取值范圍依次為:
?其中, 1 ≤ r ≤ n , 且 r 在循環(huán)算法實(shí)現(xiàn)時(shí) 代表循環(huán)嵌套的層數(shù),必須是定值。
2)遞歸
?算法實(shí)現(xiàn)
算法分析
算法設(shè)計(jì)與描述
?比較總結(jié):
|
遞歸 |
循環(huán) |
|
|
程序可讀性 |
易 |
難 |
|
代碼量大小 |
小 |
大 |
|
時(shí)間 |
長(zhǎng) |
短 |
|
占用空間 |
大 |
小 |
|
適用范圍 |
廣 |
窄 |
|
設(shè)計(jì)難度 |
易 |
難 |
總結(jié)
以上是生活随笔為你收集整理的【算法设计zxd】第一章 算法基础 4.设计工具【三角矩阵,】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 分享10道常考Java面试题及答案
- 下一篇: SQL注入时间盲注