日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 综合教程 >内容正文

综合教程

【算法设计zxd】第一章 算法基础 4.设计工具【三角矩阵,】

發(fā)布時(shí)間:2023/12/3 综合教程 32 生活家
生活随笔 收集整理的這篇文章主要介紹了 【算法设计zxd】第一章 算法基础 4.设计工具【三角矩阵,】 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

目錄

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)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。