return n*fac(n-1);} 它的意思就是說,如果n為0或1時(shí)返回1,否則返回n*f(n-1)。假設(shè) f(2),可以看一下它的運(yùn)行軌跡。
為嵐縣等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及嵐縣網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都做網(wǎng)站、網(wǎng)站建設(shè)、嵐縣網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!
這又是關(guān)鍵——n=2,因?yàn)檫@一層是用n-1=1調(diào)用的,n自然等于2!那么(2)句f=ff(n-1)*n的實(shí)質(zhì)就是f=f*n=1*2=2,接下來,用(3)將f=2返回。
=1,所以f=1,然后返回f的值也就是1。如果輸入的n=2,則f=n!=n(n-1)!,所以執(zhí)行f=ff(n-1)*n 遞歸是用堆棧的形式執(zhí)行的,這一點(diǎn)你應(yīng)該還沒學(xué)到就不用管它了。你只要知道它是如何工作的就行。。
首先你需要把那個(gè)else if (n==0, n==1) 的逗號(hào)改成或:else if (n == 0 || n == 1)這樣的話才正確,否則輸入0就報(bào)錯(cuò)了。
首先ff(5),會(huì)調(diào)用ff(5-1),也就是ff(4),在這個(gè)ff(4)返回結(jié)果前,ff(5)都會(huì)等待ff(4)的結(jié)果。同理,ff(3),ff(2)和ff(1)也是一個(gè)等待的過程。
遞歸之所以現(xiàn)在還存在是因?yàn)檫f歸可以產(chǎn)生無限循環(huán)體,也就是說有可能產(chǎn)生100層也可能10000層for循環(huán)。
即n!=1*2*3*...*(n-1)*n。而(n-1)!=1*2*3*...*(n-1)。所以可以得出,n!=(n-1)!n。
思路:遞歸求階乘函數(shù),如果輸入的參數(shù)等于1則返回1,否則返回n乘以該函數(shù)下次遞歸。
T的elem沒初始化,沒有申請(qǐng)內(nèi)存空間。而且Create的參數(shù)T必須要用引用傳遞,不然main中執(zhí)行完Create(T,a)后,T的值不會(huì)變化 。
提問者的這程序中用了遞歸算法,不過邏輯上有個(gè)小bug,就是在判斷到n==0時(shí),如果還有容量,那么返回的應(yīng)該是第一個(gè)物品的重量而不是0。你可以改變?nèi)萘緾或物品參數(shù)來檢驗(yàn)算法的邏輯正確性。
作用,清除上面一次輸入時(shí)殘留在輸入流中的字符。\x0d\x0a改用 fflush(stdin); 更佳。\x0d\x0aret = scanf(%d,%d,&a,&b); ret 為成功讀得的數(shù)據(jù)個(gè)數(shù)。
對(duì)于硬盤來說,寫入一個(gè)字節(jié)可能跟寫入一個(gè)扇區(qū)沒什么兩樣,程序員每次寫入的數(shù)據(jù)也許就幾個(gè)字節(jié),所以可以將每次寫入的幾個(gè)字節(jié)放入緩沖區(qū),排列組合成一整塊數(shù)據(jù)再寫入,也能極大的提升效率。
在輸入語句后使用fflush(stdin);表示清楚標(biāo)準(zhǔn)輸入設(shè)備(即鍵盤)的緩沖區(qū)。
c++中使用cin.sync來清除緩存區(qū)的數(shù)據(jù)流的。如果標(biāo)示符沒有改變那么即使清除了數(shù)據(jù)流也無法輸入。所以cin.clear()和cin.sync()要聯(lián)合起來使用。
如果是要清空輸出流的話,方法很多,最常見的 如endl執(zhí)行時(shí),就會(huì)清除一次輸出流。還有其他方式,如: 程序結(jié)束時(shí)。
scanf(%*[^\n]%*c)是用掃描集將緩沖區(qū)中的字符全部讀取來實(shí)現(xiàn)清除緩沖區(qū)的動(dòng)作。