張 競(jìng) 朱子楠 梁 晗 張 麗
咸陽師范學(xué)院計(jì)算機(jī)學(xué)院 陜西咸陽 712000
比較方法是指確定對(duì)象之間差異點(diǎn)和共同點(diǎn)的邏輯方法,是人類認(rèn)識(shí)事物的一種基本思維方法。人們根據(jù)一定的需要和標(biāo)準(zhǔn),把彼此有某種聯(lián)系的事物加以分析、對(duì)比,從而找出它們的內(nèi)在聯(lián)系、共同規(guī)律和特殊本質(zhì)的一種方法。客觀事物的相互聯(lián)系又相互區(qū)別是比較方法的客觀基礎(chǔ)。[1]馬克思曾經(jīng)說過“比較方法是理解現(xiàn)象的鑰匙”。[2]
在C語言程序設(shè)計(jì)課程的教學(xué)過程中,學(xué)生通過對(duì)同一個(gè)問題設(shè)計(jì)其循環(huán)程序與遞歸程序的比較,使學(xué)生親身體驗(yàn)循環(huán)程序與遞歸程序的不同,真正深刻地認(rèn)識(shí)到循環(huán)程序與遞歸程序各自的優(yōu)點(diǎn),引導(dǎo)學(xué)生更深入的認(rèn)識(shí)循環(huán)程序與遞歸程序,激發(fā)學(xué)生學(xué)習(xí)循環(huán)程序與遞歸程序的濃厚興趣。[3]
例1-1 計(jì)算數(shù)列a,aa,aaa,aaaa,aaaaa,…的第n項(xiàng)an。[4]
方法1 使用循環(huán)程序?qū)崿F(xiàn)
#include
int aaa(int a,int n)
{ int k, an=0;
if(n==1) an = a;
else for(k=1; k<=n; k++) an = an*10+a;
return an;
}
int main()
{ int a,n,an;
printf("a n = ");
scanf("%d%d",&a,&n);
an = aaa(a,n);
printf("an = %d ", an);
return 0;
}
方法2 使用遞歸程序?qū)崿F(xiàn)
#include
int aaa(int a,int n)
{ if(n==1) return a;
else return aaa(a,n-1)*10+a;
}
int main()
{ int a,n,an;
printf("a n = ");
scanf("%d%d",&a,&n);
an = aaa(a,n);
printf("an = %d ", an);
IRF2是IFN信號(hào)通路的重要組成成分,在其信號(hào)通路中IRF2與其它調(diào)節(jié)因子共同調(diào)控細(xì)胞周期,在對(duì)腫瘤的調(diào)控中具有不可忽視的作用,通過對(duì)IRF2結(jié)構(gòu)和功能的研究,我們發(fā)現(xiàn),IRF2對(duì)免疫細(xì)胞的增值具有促進(jìn)作用,可以通過提高IRF2的表達(dá)水平來增強(qiáng)機(jī)體抵御外界病毒的能力,從而減少機(jī)體患病的可能,并在某些疾病發(fā)生之初就能有效的應(yīng)對(duì)。而且IRF2與IRF1具有競(jìng)爭(zhēng)性抑制作用,可以利用這一點(diǎn)對(duì)癌癥進(jìn)行抑制,但是由于其對(duì)癌癥的雙重作用,我們可以嘗試?yán)玫鞍椎臉?gòu)象改變對(duì)其進(jìn)行進(jìn)一步研究,以希望能盡早的征服癌癥,研發(fā)出對(duì)癌癥有效的藥物。
return 0;
}
例1-2 計(jì)算斐波那契數(shù)列1,1,2,3,5,8,13,21,34,55,…的第n項(xiàng)an。[5]
方法1 使用循環(huán)程序?qū)崿F(xiàn)
#include
int fib(int n)
{ int k, a1=1,a2=1,an ;
if(n==1 || n==2) an = 1;
else for(k=3; k<=n; k++)
a1 = a2;
a2 = an;
}
return an;
}
int main()
{ int n,an;
printf("n = ");
scanf("%d",&n);
an = fib(n);
printf("an = %d ", an);
return 0;
}
方法2 使用遞歸程序?qū)崿F(xiàn)
#include
int fib(int n)
{ if(n==1 || n==2) return 1;
else return fib(n-1)+fib(n-2);
}
int main()
{ int n,an;
printf("n = ");
scanf("%d",&n);
an = fib(n);
printf("an = %d ", an);
return 0;
}
例2-1 計(jì)算自然數(shù)列1,2,3,4,5,6,7,…的前n項(xiàng)和sn。[6]
方法1 使用循環(huán)程序?qū)崿F(xiàn)
#include
int sum(int n)
{ int k,sn=0;
for(k=1;k<=n;k++) sn=sn+k;
return sn;
}
int main()
{ int n,sn;
printf("n = ");
scanf("%d",&n);
sn = sum(n);
printf("sn = %d ",sn);
return 0;
}
方法2 使用遞歸程序?qū)崿F(xiàn)
#include
int sum(int n)
{ if(n==1) return 1;
else return sum(n-1)+n;
}
int main()
{ int n,sn;
printf("n = ");
scanf("%d",&n);
sn = sum(n);
printf("sn = %d ",sn);
return 0;
}
例2-2 計(jì)算等差數(shù)列a1,a1+d,…,a1+(n-1)*d,…的前n項(xiàng)和sn。[7]
方法1 使用循環(huán)程序?qū)崿F(xiàn)
#include
int sum(int a1,int d,int n)
{ int k,ak,sn=0;
for(k=1;k<=n;k++)
{ ak=a1+(k-1)*d;
sn=sn+ak;
}
return sn ;
}
int main()
{ int a1,d,n,sn;
printf("a1 d n = ");
scanf("%d%d%d",&a1,&d,&n);
sn = sum(a1,d,n);
printf("sn = %d ", sn);
return 0;
}
方法2 使用遞歸程序?qū)崿F(xiàn)
#include
int sum(int a1,int d,int n)
{ if(n==1) return a1;
else return sum(a1,d,n-1) + a1+(n-1)*d;
}
int main()
{ int a1,d,n,sn;
printf("a1 d n = ");
scanf("%d%d%d",&a1,&d,&n);
sn = sum(a1,d,n);
printf("sn = %d ", sn);
return 0;
}
例3-1 計(jì)算兩個(gè)整數(shù)a和b的最大公約數(shù)gcd。[8]
方法1 使用循環(huán)程序?qū)崿F(xiàn)
#include
int gcd(int a,int b)
{ int r=a%b;
while(r!=0)
{ a=b;
b=r;
r=a%b;
}
return b;
}
int main()
{ int a,b;
printf("a b = ");
scanf("%d%d",&a,&b);
printf("gcd = %d ",gcd(a,b));
return 0;
}
方法2 使用遞歸程序?qū)崿F(xiàn)
#include
int gcd(int a,int b)
{ if(a%b==0) return b;
else return gcd(b,a%b);
}
int main()
{ int a,b;
printf("a b = ");
scanf("%d%d",&a,&b);
printf("gcd = %d ",gcd(a,b));
return 0;
}
例3-2 計(jì)算兩個(gè)整數(shù)a和b的最小公倍數(shù)lcm。[9]
方法1 使用循環(huán)程序?qū)崿F(xiàn)
#include
int gcd(int a,int b)
{ int r=a%b;
while(r!=0)
{ a=b;
b=r;
r=a%b;
}
return b;
}
int main()
{ int a,b;
printf("a b = ");
scanf("%d%d",&a,&b);
printf("gcd = %d ",gcd(a,b));
printf("lcm = %d ",a*b/gcd(a,b));
return 0;
}
方法2 使用遞歸程序?qū)崿F(xiàn)
#include
int gcd(int a,int b)
{ if(a%b==0) return b;
else return gcd(b,a%b);
}
int main()
{ int a,b;
printf("a b = ");
scanf("%d%d",&a,&b);
printf("gcd = %d ",gcd(a,b));
printf("lcm = %d ",a*b/gcd(a,b));
return 0;
}
有比較才有鑒別,做比較才可能有更深刻地認(rèn)識(shí)。循環(huán)程序與遞歸程序的比較如下:

序號(hào)比較項(xiàng)目循環(huán)方法遞歸方法1操作對(duì)象遞歸數(shù)列遞歸數(shù)列2使用的語句循環(huán)語句遞推語句3遞推方法人為的遞推自動(dòng)的遞推