亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? 8.txt

?? 多數情況下
?? TXT
?? 第 1 頁 / 共 3 頁
字號:
    return c;
}
main()
{
    int i;
    long s=0;
    for (i=2;i<=3;i++)
      s=s+f1(i);
    printf("\ns=%ld\n",s);
}
 
在程序中,函數f1和f2均為長整型,都在主函數之前定義,故不必再在主函數中對f1和f2加以說明。在主程序中,執行循環程序依次把i值作為實參調用函數f1求i2值。在f1中又發生對函數f2的調用,這時是把i2的值作為實參去調f2,在f2 中完成求i2!的計算。f2執行完畢把C值(即i2!)返回給f1,再由f1返回主函數實現累加。至此,由函數的嵌套調用實現了題目的要求。由于數值很大,所以函數和一些變量的類型都說明為長整型,否則會造成計算錯誤。
8.6	函數的遞歸調用
一個函數在它的函數體內調用它自身稱為遞歸調用。這種函數稱為遞歸函數。C語言允許函數的遞歸調用。在遞歸調用中,主調函數又是被調函數。執行遞歸函數將反復調用其自身,每調用一次就進入新的一層。
例如有函數f如下:
    int f(int x)
    {
      int y;
      z=f(y);
      return z;
}
這個函數是一個遞歸函數。但是運行該函數將無休止地調用其自身,這當然是不正確的。為了防止遞歸調用無終止地進行,必須在函數內有終止遞歸調用的手段。常用的辦法是加條件判斷,滿足某種條件后就不再作遞歸調用,然后逐層返回。下面舉例說明遞歸調用的執行過程。
【例8.5】用遞歸法計算n!
用遞歸法計算n!可用下述公式表示:
    n!=1         (n=0,1)
    n×(n-1)!    (n>1)
按公式可編程如下:
long ff(int n)
{
    long f;
    if(n<0) printf("n<0,input error");
    else if(n==0||n==1) f=1;
    else f=ff(n-1)*n;
    return(f);
}
main()
{
    int n;
    long y;
    printf("\ninput a inteager number:\n");
    scanf("%d",&n);
    y=ff(n);
    printf("%d!=%ld",n,y);
}
 
程序中給出的函數ff是一個遞歸函數。主函數調用ff 后即進入函數ff執行,如果n<0,n==0或n=1時都將結束函數的執行,否則就遞歸調用ff函數自身。由于每次遞歸調用的實參為n-1,即把n-1的值賦予形參n,最后當n-1的值為1時再作遞歸調用,形參n的值也為1,將使遞歸終止。然后可逐層退回。
下面我們再舉例說明該過程。設執行本程序時輸入為5,即求5!。在主函數中的調用語句即為y=ff(5),進入ff函數后,由于n=5,不等于0或1,故應執行f=ff(n-1)*n,即f=ff(5-1)*5。該語句對ff作遞歸調用即ff(4)。
進行四次遞歸調用后,ff函數形參取得的值變為1,故不再繼續遞歸調用而開始逐層返回主調函數。ff(1)的函數返回值為1,ff(2)的返回值為1*2=2,ff(3)的返回值為2*3=6,ff(4)的返回值為6*4=24,最后返回值ff(5)為24*5=120。
例8.5也可以不用遞歸的方法來完成。如可以用遞推法,即從1開始乘以2,再乘以3…直到n。遞推法比遞歸法更容易理解和實現。但是有些問題則只能用遞歸算法才能實現。典型的問題是Hanoi塔問題。
【例8.6】Hanoi塔問題
    一塊板上有三根針,A,B,C。A針上套有64個大小不等的圓盤,大的在下,小的在上。如圖5.4所示。要把這64個圓盤從A針移動C針上,每次只能移動一個圓盤,移動可以借助B針進行。但在任何時候,任何針上的圓盤都必須保持大盤在下,小盤在上。求移動的步驟。
本題算法分析如下,設A上有n個盤子。
如果n=1,則將圓盤從A直接移動到C。
如果n=2,則:
1.將A上的n-1(等于1)個圓盤移到B上;
2.再將A上的一個圓盤移到C上;
3.最后將B上的n-1(等于1)個圓盤移到C上。
  如果n=3,則:
A. 將A上的n-1(等于2,令其為n`)個圓盤移到B(借助于C),步驟如下:
(1)將A上的n`-1(等于1)個圓盤移到C上。
(2)將A上的一個圓盤移到B。
(3)將C上的n`-1(等于1)個圓盤移到B。
B. 將A上的一個圓盤移到C。
C. 將B上的n-1(等于2,令其為n`)個圓盤移到C(借助A),步驟如下:
(1)將B上的n`-1(等于1)個圓盤移到A。
(2)將B上的一個盤子移到C。
(3)將A上的n`-1(等于1)個圓盤移到C。
   到此,完成了三個圓盤的移動過程。
    從上面分析可以看出,當n大于等于2時,移動的過程可分解為三個步驟:
第一步  把A上的n-1個圓盤移到B上;
第二步  把A上的一個圓盤移到C上;
第三步  把B上的n-1個圓盤移到C上;其中第一步和第三步是類同的。
當n=3時,第一步和第三步又分解為類同的三步,即把n`-1個圓盤從一個針移到另一個針上,這里的n`=n-1。 顯然這是一個遞歸過程,據此算法可編程如下:
move(int n,int x,int y,int z)
{
    if(n==1)
      printf("%c-->%c\n",x,z);
    else
    {
      move(n-1,x,z,y);
      printf("%c-->%c\n",x,z);
      move(n-1,y,x,z);
    }
}
main()
{
    int h;
    printf("\ninput number:\n");
    scanf("%d",&h);
    printf("the step to moving %2d diskes:\n",h);
    move(h,'a','b','c');
}
 
    從程序中可以看出,move函數是一個遞歸函數,它有四個形參n,x,y,z。n表示圓盤數,x,y,z分別表示三根針。move 函數的功能是把x上的n個圓盤移動到z上。當n==1時,直接把x上的圓盤移至z上,輸出x→z。如n!=1則分為三步:遞歸調用move函數,把n-1個圓盤從x移到y;輸出x→z;遞歸調用move函數,把n-1個圓盤從y移到z。在遞歸調用過程中n=n-1,故n的值逐次遞減,最后n=1時,終止遞歸,逐層返回。當n=4 時程序運行的結果為:
    input number:
    4
    the step to moving 4 diskes:
    a→b
    a→c
    b→c
    a→b
    c→a
    c→b
    a→b
    a→c
    b→c
    b→a
    c→a
    b→c
    a→b
    a→c
b→c
8.7	數組作為函數參數
數組可以作為函數的參數使用,進行數據傳送。數組用作函數參數有兩種形式,一種是把數組元素(下標變量)作為實參使用;另一種是把數組名作為函數的形參和實參使用。
1.	數組元素作函數實參
數組元素就是下標變量,它與普通變量并無區別。 因此它作為函數實參使用與普通變量是完全相同的,在發生函數調用時,把作為實參的數組元素的值傳送給形參,實現單向的值傳送。例5.4說明了這種情況。
【例8.7】判別一個整數數組中各元素的值,若大于0 則輸出該值,若小于等于0則輸出0值。編程如下:
void nzp(int v)
{
    if(v>0)
      printf("%d ",v);
    else
      printf("%d ",0);
}
main()
{
    int a[5],i;
    printf("input 5 numbers\n");
    for(i=0;i<5;i++)
      {scanf("%d",&a[i]);
	   nzp(a[i]);}
}
 
    本程序中首先定義一個無返回值函數nzp,并說明其形參v為整型變量。在函數體中根據v值輸出相應的結果。在main函數中用一個for語句輸入數組各元素,每輸入一個就以該元素作實參調用一次nzp函數,即把a[i]的值傳送給形參v,供nzp函數使用。
2.	數組名作為函數參數
用數組名作函數參數與用數組元素作實參有幾點不同:
1)	用數組元素作實參時,只要數組類型和函數的形參變量的類型一致,那么作為下標變量的數組元素的類型也和函數形參變量的類型是一致的。因此,并不要求函數的形參也是下標變量。換句話說,對數組元素的處理是按普通變量對待的。用數組名作函數參數時,則要求形參和相對應的實參都必須是類型相同的數組,都必須有明確的數組說明。當形參和實參二者不一致時,即會發生錯誤。
2)	在普通變量或下標變量作函數參數時,形參變量和實參變量是由編譯系統分配的兩個不同的內存單元。在函數調用時發生的值傳送是把實參變量的值賦予形參變量。在用數組名作函數參數時,不是進行值的傳送,即不是把實參數組的每一個元素的值都賦予形參數組的各個元素。因為實際上形參數組并不存在,編譯系統不為形參數組分配內存。那么,數據的傳送是如何實現的呢?在我們曾介紹過,數組名就是數組的首地址。因此在數組名作函數參數時所進行的傳送只是地址的傳送,也就是說把實參數組的首地址賦予形參數組名。形參數組名取得該首地址之后,也就等于有了實在的數組。實際上是形參數組和實參數組為同一數組,共同擁有一段內存空間。
 
上圖說明了這種情形。圖中設a為實參數組,類型為整型。a占有以2000為首地址的一塊內存區。b為形參數組名。當發生函數調用時,進行地址傳送,把實參數組a的首地址傳送給形參數組名b,于是b也取得該地址2000。于是a,b兩數組共同占有以2000為首地址的一段連續內存單元。從圖中還可以看出a和b下標相同的元素實際上也占相同的兩個內存單元(整型數組每個元素占二字節)。例如a[0]和b[0]都占用2000和2001單元,當然a[0]等于b[0]。類推則有a[i]等于b[i]。
【例8.8】數組a中存放了一個學生5門課程的成績,求平均成績。
float aver(float a[5])
{
    int i;
    float av,s=a[0]; 
    for(i=1;i<5;i++) 
      s=s+a[i];
    av=s/5;
    return av;
}
void main()
{
    float sco[5],av;
    int i;
    printf("\ninput 5 scores:\n");
    for(i=0;i<5;i++)
      scanf("%f",&sco[i]);
    av=aver(sco);
    printf("average score is %5.2f",av);
}
 
本程序首先定義了一個實型函數aver,有一個形參為實型數組a,長度為5。在函數aver中,把各元素值相加求出平均值,返回給主函數。主函數main 中首先完成數組sco的輸入,然后以sco作為實參調用aver函數,函數返回值送av,最后輸出av值。 從運行情況可以看出,程序實現了所要求的功能。
3)	前面已經討論過,在變量作函數參數時,所進行的值傳送是單向的。即只能從實參傳向形參,不能從形參傳回實參。形參的初值和實參相同,而形參的值發生改變后,實參并不變化,兩者的終值是不同的。而當用數組名作函數參數時,情況則不同。由于實際上形參和實參為同一數組,因此當形參數組發生變化時,實參數組也隨之變化。當然這種情況不能理解為發生了“雙向”的值傳遞。但從實際情況來看,調用函數之后實參數組的值將由于形參數組值的變化而變化。為了說明這種情況,把例5.4改為例5.6的形式。
【例8.9】題目同8.7例。改用數組名作函數參數。
void nzp(int a[5])
{
    int i;
    printf("\nvalues of array a are:\n");
    for(i=0;i<5;i++)
    {
	if(a[i]<0) a[i]=0;
	printf("%d ",a[i]);
    }
}
main()
{
    int b[5],i;
    printf("\ninput 5 numbers:\n");
    for(i=0;i<5;i++)
      scanf("%d",&b[i]);
    printf("initial values of array b are:\n");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
    nzp(b);
    printf("\nlast values of array b are:\n");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
}
 
本程序中函數nzp的形參為整數組a,長度為5。主函數中實參數組b也為整型,長度也為5。在主函數中首先輸入數組b的值,然后輸出數組b的初始值。然后以數組名b為實參調用nzp函數。在nzp中,按要求把負值單元清0,并輸出形參數組a的值。 返回主函數之后,再次輸出數組b的值。從運行結果可以看出,數組b的初值和終值是不同的,數組b的終值和數組a是相同的。這說明實參形參為同一數組,它們的值同時得以改變。
用數組名作為函數參數時還應注意以下幾點:
a.	形參數組和實參數組的類型必須一致,否則將引起錯誤。
b.	形參數組和實參數組的長度可以不相同,因為在調用時,只傳送首地址而不檢查形參數組的長度。當形參數組的長度與實參數組不一致時,雖不至于出現語法錯誤(編譯能通過),但程序執行結果將與實際不符,這是應予以注意的。
【例8.10】如把例8.9修改如下:
void nzp(int a[8])
{
    int i;
    printf("\nvalues of array aare:\n");
    for(i=0;i<8;i++)
    {
      if(a[i]<0)a[i]=0;
      printf("%d ",a[i]);
    }
}
main()
{
    int b[5],i;
    printf("\ninput 5 numbers:\n");
    for(i=0;i<5;i++)
      scanf("%d",&b[i]);
    printf("initial values of array b are:\n");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
    nzp(b);
    printf("\nlast values of array b are:\n");
    for(i=0;i<5;i++)
      printf("%d ",b[i]);
}
 
本程序與例8.9程序比,nzp函數的形參數組長度改為8,函數體中,for語句的循環條件也改為i<8。因此,形參數組a和實參數組b的長度不一致。編譯能夠通過,但從結果看,數組a的元素a[5],a[6],a[7]顯然是無意義的。
c.	在函數形參表中,允許不給出形參數組的長度,或用一個變量來表示數組元素的個數。
例如,可以寫為:
void nzp(int a[])
或寫為
void nzp(int a[],int n)
其中形參數組a沒有給出長度,而由n值動態地表示數組的長度。n的值由主調函數的實參進行傳送。
由此,例8.10又可改為例8.11的形式。
【例8.11】
void nzp(int a[],int n)

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
久久草av在线| 日本vs亚洲vs韩国一区三区二区| 午夜精品国产更新| 97精品超碰一区二区三区| 久久午夜电影网| 美腿丝袜亚洲三区| 欧美成人猛片aaaaaaa| 视频一区欧美精品| 日韩精品中文字幕一区| 麻豆精品一区二区av白丝在线| 中文字幕av不卡| 成人综合婷婷国产精品久久蜜臀| 久久蜜臀精品av| av动漫一区二区| 亚洲人成电影网站色mp4| 99视频一区二区| 韩国av一区二区三区四区| 欧美精品一区二区三区蜜桃视频 | 丰满少妇久久久久久久| 国产欧美精品一区| 色综合天天综合色综合av| 国产精品美女久久久久高潮| av不卡一区二区三区| 久久精品国产精品亚洲精品| 亚洲www啪成人一区二区麻豆| 欧美老年两性高潮| 日日摸夜夜添夜夜添精品视频 | 亚洲精品免费播放| 欧美精品日韩一本| 色综合久久综合中文综合网| 日本网站在线观看一区二区三区| 337p粉嫩大胆噜噜噜噜噜91av| 欧美年轻男男videosbes| 韩国一区二区视频| 免费视频一区二区| 青青草精品视频| 日韩精品一二区| 丝袜亚洲另类丝袜在线| 午夜在线电影亚洲一区| 亚洲图片自拍偷拍| ww久久中文字幕| 精品久久久久久亚洲综合网| 欧美zozo另类异族| 欧美变态tickling挠脚心| 日韩欧美国产一区二区三区| 91精品国产欧美一区二区18| 大尺度一区二区| 成人手机电影网| 不卡视频一二三| 激情综合色综合久久| 一区二区不卡在线视频 午夜欧美不卡在| 欧美精品三级日韩久久| 欧美精品免费视频| 欧美一区二区久久| 精品欧美一区二区在线观看| 欧美精品一区二区不卡| 久久久久久久免费视频了| 中文字幕不卡一区| 亚洲精品国产精品乱码不99 | 中文字幕一区二区三区乱码在线 | 国产婷婷精品av在线| 91精品久久久久久久91蜜桃| 91在线免费播放| 欧美性一级生活| 不卡的电影网站| 色激情天天射综合网| 不卡一区二区在线| 欧美天堂一区二区三区| 91精品国产一区二区三区| 精品国产91洋老外米糕| 中文字幕日韩一区| 亚洲成人av中文| 国产精品自拍毛片| 精品制服美女久久| 国产·精品毛片| 在线中文字幕一区| 欧美videos大乳护士334| 久久麻豆一区二区| 一区二区三区精品| 美女一区二区三区| 9色porny自拍视频一区二区| 欧美日韩高清一区二区三区| 久久久一区二区三区| 亚洲人成精品久久久久| 蜜桃视频在线观看一区二区| 成人网男人的天堂| 欧美视频精品在线| 久久久精品天堂| 亚洲电影视频在线| 国产福利91精品一区| 国产激情一区二区三区四区| 色88888久久久久久影院野外| 日韩色视频在线观看| 精品久久久久久久久久久久包黑料| 国产精品福利av| 亚洲欧美日韩国产成人精品影院| 天天av天天翘天天综合网 | 国产精品久久久久aaaa| 日本中文字幕不卡| aaa国产一区| 久久亚洲欧美国产精品乐播| 亚洲一卡二卡三卡四卡无卡久久| 亚洲成人免费视| 成人综合在线观看| 精品国产电影一区二区| 亚洲国产精品欧美一二99| 成人免费看视频| 欧美成人女星排名| 天堂蜜桃一区二区三区 | 欧美男人的天堂一二区| 国产精品毛片大码女人| 精品一区二区在线视频| 欧美片在线播放| 一区二区三区在线看| 成人avav影音| 久久久久久亚洲综合| 久久99精品国产麻豆婷婷洗澡| 在线观看日韩电影| 欧美一级免费大片| 一区二区三区鲁丝不卡| jizz一区二区| 国产欧美日韩视频一区二区| 久久精品国产第一区二区三区 | 中文字幕精品在线不卡| 久草这里只有精品视频| 欧美一卡二卡三卡四卡| 午夜精品免费在线| 欧美影院一区二区三区| 亚洲精品视频免费看| 91影院在线免费观看| 欧美一区国产二区| 三级在线观看一区二区| 欧美日韩国产色站一区二区三区| 亚洲精品五月天| 91在线观看美女| **性色生活片久久毛片| 成人黄色大片在线观看| 亚洲欧洲成人av每日更新| caoporn国产一区二区| 国产精品免费久久| 不卡av免费在线观看| 国产精品另类一区| 波波电影院一区二区三区| 国产精品久久久99| 97国产一区二区| 一区2区3区在线看| 欧美精品v国产精品v日韩精品| 日韩中文字幕区一区有砖一区| 欧美人与性动xxxx| 日本不卡一区二区三区| 日韩午夜在线播放| 国产一区二区三区免费观看| 欧美日韩免费一区二区三区视频| 国产欧美日韩另类视频免费观看 | 国产麻豆精品theporn| 国产夜色精品一区二区av| 国产成人精品亚洲日本在线桃色| 国产精品素人视频| 91九色最新地址| 丝袜美腿亚洲色图| 久久久久久影视| 91免费在线视频观看| 亚洲二区在线视频| 精品久久久久久最新网址| 成人精品在线视频观看| 亚洲男人的天堂网| 777色狠狠一区二区三区| 精品写真视频在线观看| 中文字幕成人在线观看| 欧美午夜一区二区| 欧美aⅴ一区二区三区视频| 久久久精品2019中文字幕之3| 91啪九色porn原创视频在线观看| 视频一区中文字幕| 欧美国产日韩亚洲一区| 欧美在线一区二区三区| 久久99精品国产麻豆婷婷洗澡| 国产精品免费观看视频| 欧美精品高清视频| 国产精品1区二区.| 亚洲午夜久久久久久久久电影网 | 欧美成人在线直播| 不卡一区中文字幕| 蜜臀久久久99精品久久久久久| 国产精品免费视频观看| 欧美精品久久一区| 成人av免费在线观看| 日一区二区三区| 中文字幕在线观看一区二区| 欧美高清视频www夜色资源网| 国产黄色精品视频| 偷拍与自拍一区| 国产精品丝袜黑色高跟| 欧美一区二区在线免费播放| 成人h精品动漫一区二区三区| 中文av一区二区| 在线区一区二视频| 国产高清亚洲一区| 日韩制服丝袜av| 日韩毛片高清在线播放|