計(jì)算機(jī) 基礎(chǔ)編程基礎(chǔ)_第1頁(yè)
計(jì)算機(jī) 基礎(chǔ)編程基礎(chǔ)_第2頁(yè)
計(jì)算機(jī) 基礎(chǔ)編程基礎(chǔ)_第3頁(yè)
計(jì)算機(jī) 基礎(chǔ)編程基礎(chǔ)_第4頁(yè)
計(jì)算機(jī) 基礎(chǔ)編程基礎(chǔ)_第5頁(yè)
已閱讀5頁(yè),還剩55頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

編程基礎(chǔ)V1.00正式版By06B1王崇生更新日志2007.5.13開(kāi)始編寫(xiě)2007.5.14發(fā)布V0.9Beta2007.5.15發(fā)布V0.93Beta*更新了關(guān)于JavaScript的基本知識(shí);*在澤娜的啟發(fā)下添加了小題以區(qū)分大題;*補(bǔ)寫(xiě)了《寫(xiě)在前面》2007.5.17發(fā)布V0.96Beta優(yōu)化了一些表達(dá);添加了斐波納契的非遞歸編程;添加了*號(hào)輸出問(wèn)題的解答;2007.5.19發(fā)布V0.98Beta在詠芝的啟發(fā)下添加了自定義函數(shù)的return的說(shuō)明;在焱焱的啟發(fā)下添加了連續(xù)數(shù)和問(wèn)題的自寫(xiě)程序;2008.5.3發(fā)布V1.00正式版更正了部份文字的表述錯(cuò)誤寫(xiě)在前面編程也許是讓很多學(xué)計(jì)基的人頭痛的事情,尤其是在一本不太適合初學(xué)者使用的教程面前。例如,順序、選擇、循環(huán)三種結(jié)構(gòu)是結(jié)構(gòu)化編程的根基所在,但書(shū)本卻只花了一頁(yè)紙就一筆帶過(guò)了,因此為了說(shuō)明許多問(wèn)題,這篇《編程基礎(chǔ)》初稿整整用了兩天才寫(xiě)完。還是那一句話,希望這些東西對(duì)大家有所幫助。例牌一語(yǔ):錯(cuò)誤難免,萬(wàn)望見(jiàn)諒。如果你發(fā)現(xiàn)了其中的錯(cuò)誤又或者有什么地方看不明白的,可以找我問(wèn)問(wèn),我的Q號(hào)是495282781。勇于探索,甘于寂寞程序員,一個(gè)我們?cè)?jīng)以為跟自己毫不相關(guān)的身份,如今竟真的臨到我自己身上。記得比爾·蓋茨說(shuō)過(guò),作為一個(gè)優(yōu)秀的程序員,必須“勇于探索,甘于寂寞”。真的道出了作為一個(gè)程序員的必備條件。“勇于探索”,那就是,編程在世界上是沒(méi)有標(biāo)準(zhǔn)答案的,只有自己去探索,同時(shí),教材上并不能將編程的一切都寫(xiě)上,很多不懂的地方是需要我們自己去試驗(yàn)去探索。而“甘于寂寞”,是因?yàn)榫幊滩豢赡芤徊降轿坏模粋€(gè)程序是需要反復(fù)調(diào)試才能編寫(xiě)成功的。因此,作為程序員必須要有“長(zhǎng)時(shí)間在一堆代碼中來(lái)回”的耐心。想要是一步到位,是程序員尤其是初學(xué)者之大忌一、算法與流程圖算法,是計(jì)算機(jī)解決問(wèn)題的方法和步驟,它并不能給出問(wèn)題的答案,只是說(shuō)明怎樣才能得到答案。編程關(guān)鍵在于設(shè)計(jì)出一個(gè)好的算法,算法是編程的核心。算法通常用流程圖來(lái)描述。當(dāng)我們需要用編程來(lái)解決實(shí)際問(wèn)題時(shí),我們需要把自己模擬成計(jì)算機(jī),從計(jì)算機(jī)的角度去看問(wèn)題,而計(jì)算機(jī)的特點(diǎn)是一次只能處理一個(gè)指令,一次指令處理完,再處理下一次的指令。人的大腦可以同時(shí)處理幾個(gè)指令指令1計(jì)算機(jī)只能先把一個(gè)指令處理完了再處理另一個(gè)指令2指令1指令2現(xiàn)在,讓我們通過(guò)一個(gè)小例子來(lái)認(rèn)識(shí)計(jì)算機(jī)算法。將兩個(gè)變量X和Y的值交換,X的值是5,Y的值是10對(duì)于我們來(lái)講,這個(gè)問(wèn)題相當(dāng)簡(jiǎn)單,當(dāng)我們看到“X=5,Y=10,相互交換數(shù)值”之時(shí),我們?cè)谔幚怼皩值賦給X”的同時(shí),也在處理“將X值賦給Y”,而計(jì)算機(jī)則不行,計(jì)算機(jī)必須處理完前一個(gè)指令,再處理后一個(gè)指令。人的大腦可以同時(shí)處理幾個(gè)指令將Y值賦給X將X值賦給Y計(jì)算機(jī)一次只能處理一個(gè)指令將Y值賦給X將X值賦給Y這個(gè)指令要等前一個(gè)指令執(zhí)行完才能被執(zhí)行但是,這里出現(xiàn)問(wèn)題了。當(dāng)計(jì)算機(jī)執(zhí)行完“將Y值賦給X”后,X=10(Y),再執(zhí)行“將X值賦給Y”時(shí),Y得到的值是多少呢?是10!因?yàn)楫?dāng)“將X值賦給Y”這條指令執(zhí)行時(shí),前一條指令已經(jīng)執(zhí)行完了,也就是說(shuō)X已經(jīng)是10了!計(jì)算機(jī)一次只能處理一個(gè)指令將X值賦給Y將Y值賦給X這個(gè)指令已經(jīng)執(zhí)行完了,X的值是10了為了更好地理解這個(gè)問(wèn)題,我們先來(lái)玩一個(gè)游戲,現(xiàn)在有X、Y兩個(gè)人,每個(gè)人手上的都有一塊橡皮、一支鉛筆和一張紙,并且我們規(guī)定,每個(gè)人的紙上只能記下一個(gè)數(shù)字?,F(xiàn)在X上面記的是5,Y上面記的是10。我們要他們交換彼此上面所記的數(shù)字。510X的紙上記的是5Y的紙上記的是10如果,我們先把Y記的數(shù)字讓X去抄下來(lái)(也就相當(dāng)于“將Y值賦給X”),那么X就會(huì)先拿橡皮把自己紙上記的5擦掉,然后抄下Y記的10。如果我們?cè)侔裍記的數(shù)字讓Y去抄下來(lái)(也就相當(dāng)于“將X值賦給Y”)的話,Y所抄下的數(shù)字是多少呢?自然是10。那么前面出現(xiàn)的問(wèn)題就好理解得多了,因?yàn)閅并不會(huì)去記住X的原值5,當(dāng)X先把Y的10抄下來(lái)后,Y看到X的只能是10。10X抄下Y的紙上記的數(shù)字后,記的是1010此時(shí)讓Y去抄X紙上記的數(shù),Y抄下的自然是105X的紙上記的是5現(xiàn)在,我們?cè)倩剡^(guò)來(lái)看計(jì)算機(jī),就可以知道,計(jì)算機(jī)不僅一次只能處理一個(gè)指令,而且一個(gè)變量只能儲(chǔ)存一個(gè)數(shù)值(不存在X儲(chǔ)存了前值5后值10,X儲(chǔ)存的要么是5,要么是10)。這里要補(bǔ)充一下,在后面還會(huì)講到一種叫“數(shù)組”的變量,是可以實(shí)現(xiàn)記下多個(gè)數(shù)字的。但“數(shù)組”就像一堆紙那樣,第1張只能記一個(gè)數(shù),第2張也是只能記一個(gè)數(shù),只是把這些紙放在一起變成“一堆紙”而已。之前我們研究得知,不能用先“將Y值賦給X”再“將X值賦給Y”的辦法實(shí)現(xiàn)交換,那么,有沒(méi)有辦法解決這個(gè)問(wèn)題呢?還是讓我們回到我們的游戲中去?,F(xiàn)在,X和Y想到了一個(gè)好辦法。他們找來(lái)了他們的好朋友Z,他們先讓Z抄下X記的數(shù)字,這時(shí),Z記得是5。然后,再讓X抄下Y記的數(shù),X記得是10。緊接著,Y去抄下Z記下的數(shù),Y抄下的,就是Z記的X的原本的數(shù)字,也就是5。那么,就成功地實(shí)現(xiàn)了交換數(shù)字了?,F(xiàn)在再回到計(jì)算機(jī)中,我們可以先引入一個(gè)變量Z,讓計(jì)算機(jī)執(zhí)行“將X值賦給Z”-“將Y值賦給X”-“將Z值賦給Y”,那么,問(wèn)題就被成功地解決了。X=5,Y=10Z=XX=Y將X值賦給ZZX=5Y=ZX=10,Y=5將Y值賦給XXY=10將Z值賦給YYZ=5二、JavaScripta基礎(chǔ)也許有人在高中學(xué)過(guò)VisualBasic編程,但是,各種程序語(yǔ)言都有自己的語(yǔ)法,如Basic的輸出用的是print,Pascal的輸出用的是write。其實(shí),語(yǔ)法對(duì)比算法,實(shí)在不算重要那么下面我們來(lái)說(shuō)一下JavaScript的基本語(yǔ)法。具體可以參考書(shū)本的4.5節(jié),從P160到P170。下面我列舉常用的一些語(yǔ)法。先說(shuō)變量,來(lái)看下面三個(gè)表示式。x=5x=“abc”;x=“5”x=truex=5:這里的x是一個(gè)數(shù)值型變量x=“abc”;x=“5”:這里的x是一個(gè)字符串型變量,也就是說(shuō),x儲(chǔ)存的,不是一個(gè)數(shù)值,而是一個(gè)數(shù)字、一個(gè)字符,如“一鳴驚人”的“一”,與“1+2=3”中的“1”,一個(gè)是字符,一個(gè)是數(shù)字。引號(hào)是它的重要標(biāo)志。x=true:這里的x是一個(gè)布爾型變量,是用來(lái)表示命題的真假,它只有true和false兩個(gè)值。如1<2的值是true,5>9的值是false。y=10y10,為y賦值x=y將y值賦予x(不是判斷二者是否相等)x==y(!==)這個(gè)才是判斷x,y是否相等(不相等)y=113%10除取余,113÷10=10…3,y得到的值是3z=5+(-,*,/)3相加(減/乘/除),z得到的是8(2/15/1.666……)3>2&&4>5邏輯與(且/交集),此值為假3>2||4>5邏輯或(或/并集),此值為真sum+=i相當(dāng)于sum=sum+i*/%+-<<=>>===!=&&||=+=優(yōu)先級(jí)JavaScript是對(duì)大小寫(xiě)敏感的,也就是說(shuō)X與x是兩個(gè)不同的變量,Var與var也是不一樣的n=parseInt(WScript.StdIn.ReadLine());WScript.StdOut.WriteLine(N);這兩句是經(jīng)常使用的輸入輸出語(yǔ)句,PS:WScript.StdIn.ReadLine()輸入的是字符串,而parseInt是將字符串中的數(shù)字轉(zhuǎn)化為數(shù)值。在調(diào)試時(shí),計(jì)算機(jī)會(huì)告訴我們錯(cuò)誤于哪里,如WScript.StdOut.WriteLine(4;如果你運(yùn)用這個(gè)程序,計(jì)算機(jī)會(huì)顯示:“(1,27)編譯錯(cuò)誤:缺少‘)’”P(pán)S:要修改可以直接“右鍵-編輯”,修改完記得按Ctrl+S或點(diǎn)“保存”保存哦。第1行第27個(gè)字符這里少了右括號(hào)一些建議這里給大家一些建議,在做題時(shí)經(jīng)常需要調(diào)試程序的。大家可以把用記事本寫(xiě)好的程序以.js為擴(kuò)展名保存在桌面,并用英文來(lái)命名,如try.js。然后按“開(kāi)始-運(yùn)行,輸入cmd”或者“開(kāi)始-所有程序-附件-命令提示符”,進(jìn)入“命令提示符”。默認(rèn)是“我的文檔”的實(shí)際地址,大家只要輸入“cd桌面”(“cd文件夾名”是進(jìn)入該文件夾的DOS命令),進(jìn)入桌面后,輸入CScripttry.js,就可以在DOS中運(yùn)行你所編寫(xiě)的程序了。因?yàn)樵赪indows打開(kāi)是很麻煩的并且不能輸入數(shù)據(jù)。另外,在“命令提示符”中,只要按鍵盤(pán)的向上鍵,就可以重新使用之前所輸入的命令了,非常方便。三、三種基本流程結(jié)構(gòu)1966年,Bohm和Jacopini證明了只用三種基本的控制結(jié)構(gòu)就能實(shí)現(xiàn)任意單入口和單出口的程序,這三種基本控制結(jié)構(gòu)是順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。這三種結(jié)構(gòu),是我們解決編程問(wèn)題的三把利劍,尤其是選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu)。我們先講順序結(jié)構(gòu)吧。所謂的順序結(jié)構(gòu),就依照指令的順序,一條一條地執(zhí)行,如前面的賦值。X=5,Y=10Z=XX=YY=ZX=10,Y=5接下來(lái),我們講選擇結(jié)構(gòu)。這里,我們來(lái)舉例說(shuō)明。問(wèn)題:輸出X、Y中較大的值。其中,X=5,Y=10。在這里,我們的思路要換一換,除了“比較二者后輸出較大者”這種思路,還有另一種思路,那就是“判斷‘X>Y’這個(gè)命題是真還是假,如果是真,就輸出Y,如果是假,就輸出X”它的流程圖是這樣的:選擇結(jié)構(gòu)的流程圖如下選擇結(jié)構(gòu)在JavaScript中的常用格式If(判斷條件)語(yǔ)句1else語(yǔ)句2X=5,Y=10X>Y輸出X真輸出Y假varX=5,Y=10;if(X>Y){WScript.StdOut.WriteLine(X);}else{WScript.StdOut.WriteLine(Y);}選擇結(jié)構(gòu)常用于情況的判斷選擇,如題目“請(qǐng)輸入學(xué)生分?jǐn)?shù)X,如果大于或等于60,則顯示‘及格’,否則顯示‘不及格’”我們便可以使用判斷語(yǔ)句。if(x>=60)WScript.StdOut.WhiteLine(“及格”);elseWScript.StdOut.WhiteLine(“不及格”);最后,我們講循環(huán)結(jié)構(gòu)。還是通過(guò)舉例來(lái)說(shuō)明。問(wèn)題:請(qǐng)算出1+2+3+……+100的結(jié)果。顯然,計(jì)算機(jī)不會(huì)明白省略號(hào)的意義,但是要我們?cè)谟?jì)算機(jī)中輸入100個(gè)數(shù)字和99個(gè)加號(hào)顯然是不現(xiàn)實(shí)的。所以,我們就要用到循環(huán)結(jié)構(gòu)了。首先,我們將1+2+……+100理解為右圖的形式。它的規(guī)律是:A、B有個(gè)初始值0、1,先算A+B,然后讓下一式中的A等于上一式的和,B則等于上一式的B+1。這樣,我們只要告訴計(jì)算機(jī)首先“AA+B”,然后“BB+1”,接著又執(zhí)行相同的“AA+B”,“BB+1”,直到i等于100為止。1+2=33+3=66+4=100+1=1+1+1+1……4950+100=5050現(xiàn)在我們?cè)O(shè)sum=0,i=1,明顯這時(shí)符合i<=100的條件,計(jì)算機(jī)就往下執(zhí)行前面我們說(shuō)的首先“sumsum+i”,然后“ii+1”,接著,返回并再次判斷是否符合i<=100的條件,此時(shí)sum等于1,i等于2,符合條件,計(jì)算機(jī)便往下執(zhí)行“sumsum+i”;“ii+1”,接著,返回并再次判斷是否符合i<=100的條件……不斷地返回、判斷,直到i遞加到101時(shí),不符合i<=100,便跳出“sumsum+i”;“ii+1”這個(gè)循環(huán)體,往下執(zhí)行別的指令。sum=0;i=1i<=100sum=sum+i;i=i+1falsetruevarsum=0,i;for(i=1;i<=100;i++){sum+=i;}WScript.StdOut.WriteLine(sum);四、自定義函數(shù)與嵌套、遞歸所謂自定義函數(shù),就是一串由我們指定的指令而組成的一個(gè)小程序,使用函數(shù)的一個(gè)顯而易見(jiàn)的好處就是可重用性。如在前面的1+2+……100的問(wèn)題中,“sum+=i;i++”是一串反復(fù)調(diào)用的語(yǔ)句,我們可以自定義一個(gè)函數(shù)qihe(sum,i),其內(nèi)容是“sum+=i;i++”。另一個(gè)例子請(qǐng)參考P196的例4.39可以用我們的數(shù)學(xué)思維去理解,比如公式:V(x,y,z)=xyz,這個(gè)公式是可以反復(fù)使用的,只要我們得知長(zhǎng)寬高的值。只是編程中的自定義函數(shù)范圍更廣,內(nèi)容更多。returnReturn是自定義函數(shù)中常見(jiàn)的一個(gè)命令,其作用是結(jié)束函數(shù)體的執(zhí)行,并把其后的表達(dá)式的值返回到主程序。我們來(lái)看一個(gè)簡(jiǎn)單的例子。functionyugi();n=5;returnn;varn=10;yugi();WScript.Echo(n);這條程序輸出的應(yīng)該是5,因?yàn)樽远x函數(shù)將5賦值了給n,returnn把“n的值是5”這個(gè)結(jié)果返回給主程序,因此,主程序輸出n,而n的值是5。那么,如果把returnn去掉。那輸出的又會(huì)是多少呢?functionyugi();n=5;varn=10;yugi();WScript.Echo(n);沒(méi)錯(cuò),是10。在主程序中定義了n并將10賦值給它,雖然在自定義函數(shù)中將5賦值給n,但是這個(gè)結(jié)果并不返回到主程序中,輸出的仍然是10。當(dāng)然,如果n在主程序中沒(méi)有賦值,那么,就算沒(méi)有return,也會(huì)返回n的值。嵌套所謂的嵌套,就是在一個(gè)函數(shù)的過(guò)程中,調(diào)用另一個(gè)函數(shù)的情況。如下圖:functionf(){…g()

…}functiong(){……

…}遞歸在實(shí)際中,有時(shí)會(huì)出現(xiàn)函數(shù)中調(diào)用自身的情況,稱之為“遞歸”。這也是本書(shū)編程部分個(gè)人認(rèn)為最難理解的部分。下面,我們通過(guò)P199的例4.42,來(lái)說(shuō)明“遞歸”這種思維。問(wèn)題:求階乘n!的值。現(xiàn)在要求n!的值,我們的思路是:主程序負(fù)責(zé)處理輸入n值,自定義一個(gè)jc()函數(shù),專門計(jì)算n!的值。varn,N=0;n=parseInt(WScript.StdIn.ReadLine());jc(n);WScript.StdOut.WriteLine(N);可以看到,主程序是非常簡(jiǎn)單的。下面我們來(lái)看jc(n)這個(gè)函數(shù)如何編寫(xiě)。functionjc(n){if(n>1)N=n*jc(n-1);elseN=1;returnN;}我們以n=5為例,算一下5的階乘。5>1,真N=5*jc(5-1)4>1,真N=4*jc(4-1)3>1,真N=3*jc(3-1)2>1,真N=2*jc(2-1)1>1,假N=112345,返回16,返回2*1=27,返回3*2=68,返回4*6=249,返回5*24=120從不符合條件到符合條件四、關(guān)于編程題的解答小題題型主要是一些涉及概念的考查,又或者是一些小程序的求解。如:請(qǐng)選出符合false||()為真的選項(xiàng)。A、”5==5”B、2>3C、falseD、5==5答案是D。A是一個(gè)字符串,不存在真與假的問(wèn)題;B明顯是假;C也是假;D為真,故選D。判斷:JavaScript允許在一個(gè)函數(shù)的函數(shù)體中調(diào)用另一個(gè)函數(shù)。正確?錯(cuò)誤?明顯正確。詳見(jiàn)“嵌套、遞歸”。下面哪一個(gè)語(yǔ)句定義了一個(gè)名為pageNumber的變量并將它的值賦為240?[A]varPageNumber=240[B]pagenumber=240[C]varpageNumber=240[D]varintnamedpageNumber=240A定義的是PageNumber;B定義的是pagenumber;D多了intnamed;正確答案是C表達(dá)式123%7的計(jì)算結(jié)果是_____。[A]2[B]3[C]4[D]5答案:C(123÷7=17……4)下面的哪一個(gè)表達(dá)式將返回真?[A](3==3)&&(5<1)[B]!(17<=20)[C](3!=3)||(7<2)[D](1==1)||(2<0)A:真&&假假;B:!(真)假C:假|(zhì)|假假;D:真||假真故選D目前,編程題的大題題型主要有:完善程序:給出問(wèn)題和(或)答案,以及大部分程序,但關(guān)鍵部分留空,待答題者填上,我在免修試中只遇到過(guò)這種。編寫(xiě)程序求解問(wèn)題:給出一個(gè)人腦不可能在短時(shí)間內(nèi)解決只能通過(guò)編程讓計(jì)算機(jī)求解的問(wèn)題,讓答題者求出答案讀程序?qū)懡Y(jié)果:要求答題者讀完程序后筆算出結(jié)果,我們考試是機(jī)試,所以一般不出這種題型。下面我們來(lái)舉幾個(gè)例子,首先是前面用遞歸解決的n!問(wèn)題,現(xiàn)在我們想一想,能不能不用遞歸解決嗎?答案是可以的,但是遞歸思想是有它的先進(jìn)性的,對(duì)于編程解決許多問(wèn)題是很有幫助的。好,回到正題,類似這種其中一個(gè)變量是以1遞增(1*2*3……)的問(wèn)題。我們是毫不猶豫地選擇“循環(huán)”。仿照1+2+3……設(shè)計(jì)的“sum作累加i作遞增”的思路,我們用s作累乘器,i作遞增。那么,思路就出來(lái)了。s的初始值是1,i的初始值是1;s=s*i,i=i+1;i遞增到由用戶輸入的n為止。寫(xiě)成程序,如下vars=1,i,n;n=parseInt(WScript.StdIn.ReadLine());for(i=1;i<=n;i++){s=s*i;}WScript.StdOut.WriteLine(s);完善程序題:參照書(shū)本P206的第20題的式子,計(jì)算Pi的值。程序以給出。varPi,i,n;n=parseInt(WScript.StdIn.ReadLine());for(……1……){if(…2…)Pi=Pi-1/(2*i-1);elsePi=Pi+1/(2*i-1);}WScript.StdOut.WriteLine(…3…);

明顯第三空填的是:4*Pi。第一個(gè)空是循環(huán)條件。很自然,我們知道,i的初始值是1,直到n結(jié)束,i=i+1。所以,第一空填的是:i=1;i<=n;i++接著,是一個(gè)判斷結(jié)構(gòu)。條件為真則Pi=Pi-1/(2*i-1),為假則Pi=Pi+1/(2*i-1)。那么條件應(yīng)該是什么呢?應(yīng)該是奇數(shù)項(xiàng)執(zhí)行+,偶數(shù)項(xiàng)執(zhí)行-,但是,并沒(méi)有一個(gè)指令用來(lái)判斷奇偶啊,怎么辦呢?我們知道,奇偶的本質(zhì)是:偶數(shù)能被2整除,而奇數(shù)不能被2整除而且余數(shù)肯定是1。余數(shù)?想到什么了?對(duì)了,是除取余%!我們可以通過(guò)除取余%來(lái)判斷余數(shù)是否為1(除以2余數(shù)不為1就為0),進(jìn)而得知某個(gè)數(shù)是奇是偶。那么問(wèn)題就解決了!是為真(也就是i是偶數(shù))就執(zhí)行-,為假(也就是i是奇數(shù))就執(zhí)行+。第二空填的是:i%2==0(當(dāng)然,填:i%2!==1,也是可以的)注意:==是判斷二者是否相等,=是賦值。一些體會(huì)一點(diǎn)啟發(fā)相信到這里,大家都會(huì)感覺(jué)到,用編程來(lái)解題,其中很重要的一點(diǎn)就是轉(zhuǎn)化或者說(shuō)是翻譯。要把思路、方法、條件等轉(zhuǎn)化、翻譯成計(jì)算機(jī)能看懂的語(yǔ)言。就像上面這題,計(jì)算機(jī)不會(huì)判斷奇偶,但會(huì)“除取余”這種運(yùn)算,會(huì)判斷兩個(gè)數(shù)是否相等。因此,我們要把判斷一個(gè)數(shù)的奇偶轉(zhuǎn)化成判斷這個(gè)數(shù)除以2的余數(shù)與1是否相等,才能為計(jì)算機(jī)所識(shí)別?,F(xiàn)在來(lái)看書(shū)本P206的19題?!办巢{契(Fibonacci)數(shù)列”的第1項(xiàng)和第2項(xiàng)都是1,之后各項(xiàng)是前兩項(xiàng)的和。1,1,2,3,5,8,13,21……現(xiàn)在要求第N項(xiàng)的值,我們用遞歸來(lái)解決,思維是:主程序負(fù)責(zé)處理輸入N值,自定義一個(gè)Fibo()函數(shù),專門計(jì)算第N項(xiàng)的值。varn,N;n=parseInt(WScript.StdIn.ReadLine());Fibo(n);WScript.StdOut.WriteLine(N);可以看到,主程序是非常簡(jiǎn)單的。下面我們來(lái)看Fibo(n)這個(gè)函數(shù)如何編寫(xiě)。functionFibo(n){if(n>2){N=Fibo(n-1)+Fibo(n-2);}else{N=1;}returnN;}下面我們以第五項(xiàng)(n=5)為例,來(lái)看一下遞歸思想。N=Fibo(5-1)+Fibo(5-2);5>2,真functionFibo(n){if(n>2){N=Fibo(n-1)+Fibo(n-2);}else{N=1;}returnN;}N=Fibo(4-1)+Fibo(4-2);4>2,真N=Fibo(3-1)+Fibo(3-2);3>2,真1>2,假N=12>2,假N=12>2,假N=1N=Fibo(3-1)+Fibo(3-2);3>2,真1>2,假N=12>2,假N=1現(xiàn)在再來(lái)思考,可不可以不用遞歸呢?答案也是可以的。但如何實(shí)現(xiàn)呢?我們會(huì)很正常地想到循環(huán)結(jié)構(gòu),但具體應(yīng)該如何實(shí)現(xiàn)呢?還是回到斐波納契數(shù)列的規(guī)律,頭兩項(xiàng)為1,之后每一項(xiàng)是前兩項(xiàng)的和。首先應(yīng)該有一個(gè)判斷,因?yàn)楫?dāng)用戶輸入1或2時(shí),我們就讓計(jì)算機(jī)直接輸出“該項(xiàng)等于1”。if(n<=2)WScript.StdOut.WriteLine(“該項(xiàng)等于1”);else{……}現(xiàn)在重點(diǎn)是n>=3的情況。我們知道,循環(huán)結(jié)構(gòu)是反覆執(zhí)行相同的語(yǔ)句的。那么,對(duì)于此數(shù)列,我們可以假設(shè)c是第n項(xiàng),b是第n-1項(xiàng),a是第n-2項(xiàng)。初始,a=1,b=1ca+b(每一項(xiàng)是前兩項(xiàng)的和)那么,如果c是我們要輸出的那項(xiàng),便跳出循環(huán),如果不是,那么,對(duì)于下一項(xiàng),應(yīng)該是ab,bc然后又執(zhí)行ca+bvara=1,b=1,n,c;n=parseInt(WScript.StdIn.ReadLine());if(n<=2)WScript.StdOut.WriteLine("該項(xiàng)是1");else{for(i=3;i<=n;i++){c=a+b;a=b;b=c;}WScript.StdOut.WriteLine("該項(xiàng)是"+c);}現(xiàn)在我們?cè)賮?lái)看P206的18題。假設(shè)一共有N行,我們可以發(fā)現(xiàn)每一行的特點(diǎn)是:第n行有n個(gè)*;第n行的第一個(gè)*前面有N-n個(gè)空格。那么我們?cè)賮?lái)想想,這個(gè)程序能不能分成兩部分呢?一部分是負(fù)責(zé)依照N,n的值來(lái)輸出每一行的空格與*,一部分負(fù)責(zé)處理N,n的值。負(fù)責(zé)依照N,n的值來(lái)輸出每一行的空格與*functionhang(n,N){vars=““,x=“”,i,j;for(i=1;i<=N-n;i++)s+=““;for(j=1;j<=n;j++)x+=“*“;WScript.StdOut.WriteLine

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論