常用演算法 遞推法

2021-05-22 19:52:55 字數 1539 閱讀 3794

遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為n的解,當n=1時,解或為已知,或能非常方便地得到解。能採用遞推法構 造演算法的問題有重要的遞推性質,即當得到問題規模為i-1的解後,由問題的遞推性質,能從已求得的規模為1,2,…,i-1的一系列解,構造出問題規模為 i的解。這樣,程式可從i=0或i=1出發,重複地,由已知至i-1規模的解,通過遞推,獲得規模為i的解,直至得到規模為n的解。 

【問題】    階乘計算 

問題描述:編寫程式,對給定的n(n≦100),計算並輸出k的階乘k!(k=1,2,…,n)的全部有效數字。 

由於要求的整數可能大大超出一般整數的位數,程式用一維陣列儲存長整數,儲存長整數陣列的每個元素只儲存長整數的一位數字。如有m位成整數n用陣列a[ ]儲存: 

n=a[m]×10m-1+a[m-1]×10m-2+ … +a[2]×101+a[1]×100 

並用a[0]儲存長整數n的位數m,即a[0]=m。按上述約定,陣列的每個元素儲存k的階乘k!的一位數字,並從低位到高位依次存於陣列的第二個元素、第三個元素……。例如,5!=120,在陣列中的儲存形式為: 

3    0    2    1    …… 

首元素3表示長整數是乙個3位數,接著是低位到高位依次是0、2、1,表示成整數120。 

計算階乘k!可採用對已求得的階乘(k-1)!連續累加k-1次後求得。例如,已知4!=24,計算5!,可對原來的24累加4次24後得到120。細節見以下程式。 

# include

# include

# define maxn    1000 

void pnext(int a[ ],int k) 

{    int *b,m=a[0],i,j,r,carry; 

b=(int * ) malloc(sizeof(int)* (m+1)); 

for ( i=1;i<=m;i++)      b=a; 

for ( j=1;j<=k;j++) 

{    for ( carry=0,i=1;i<=m;i++) 

{    r=(ia=r%10; 

carry=r/10; 

if (carry) a[++m]=carry; 

free(b); 

a[0]=m; 

void write(int *a,int k) 

{    int i; 

printf(「%4d!=」,k); 

for (i=a[0];i>0;i--) 

printf(「%d」,a); 

printf(「/n/n」); 

void main() 

{    int a[maxn],n,k; 

printf(「enter the number n: 「); 

scanf(「%d」,&n); 

a[0]=1; 

a[1]=1; 

write(a,1); 

for (k=2;k<=n;k++) 

{    pnext(a,k); 

write(a,k); 

getchar(); 

常用演算法設計方法 三 遞推法

遞推法是利用問題本身所具有的一種遞推關係求問題解的一種方法。設要求問題規模為n的解,當n 1時,解或為已知,或能非常方便地得到解。能採用遞推法構造演算法的問題有重要的遞推性質,即當得到問題規模為i 1的解後,由問題的遞推性質,能從已求得的規模為1,2,i 1的一系列解,構造出問題規模為i的解。這樣,...

基礎演算法之遞推法

一.倒推法 例1 儲油點 每次送油到儲存點,因為每次從n 1處出發至n處時都是攜帶500公升油,往返次數越少說明花掉的油最少。int main int k,d k為儲油點位置序號,d為累計終點至當前儲油點的距離 int oil 10 dis 10 儲油點的油量和離終點的距離 int i 輔助變數 k...

演算法設計 之 遞推法

遞推法就是根據已知條件,分析推導出問題中的聯絡,然後一步一步進行推倒直至得到結果。根據具體問題我們需要選擇是正推還是逆推來解決問題。下面先舉乙個遞推中的經典例子,就是求兔子數量的問題 現有乙隻乙個月大的兔子,已知當兔子在第三個月大時每月就可以生下乙隻小兔子 好吧,就按兔子是無性繁殖的 求一年後兔子的...