liuxing167756 所說(shuō)是正解:(本質(zhì)就是計(jì)算斐波那契數(shù)列)
從事資陽(yáng)服務(wù)器托管,服務(wù)器租用,云主機(jī),網(wǎng)絡(luò)空間,域名注冊(cè),CDN,網(wǎng)絡(luò)代維等服務(wù)。
fun 這個(gè)無(wú)返回值函數(shù)需要依靠 f1 ,f2 兩局部變量用來(lái)傳遞每一次調(diào)用的結(jié)果地址(局部變量在堆棧中),每次調(diào)用都會(huì)不一樣。最后的返回值是靠*S來(lái)傳送的。這種用法在返回值很多時(shí)常用。多值可以用數(shù)組指針,可以用結(jié)構(gòu)指針。之所以這樣用 因?yàn)? fun(n) = fun(n-1) + fun(n-2) 對(duì)推公式中需要兩個(gè)不同的返回值!更簡(jiǎn)單的公式如:fun(x)=fun(x-1)+5 可以直接用帶返回值得函數(shù)遞歸形式。任何遞推公式都可以用遞歸實(shí)現(xiàn),遞歸轉(zhuǎn)遞推就不一定了。遞歸的優(yōu)點(diǎn)是形式簡(jiǎn)單執(zhí)行效率低,內(nèi)存資源消耗大。
根據(jù)題意是:
fun(0) = 1;
fun(1) = 1;
fun(n) = fun(n-1) + fun(n-2).
就是斐波那契數(shù)列
n 0 1 2 3 4 5 6
x 1 1 2 3 5 8 13
由于是遞歸調(diào)用,所以,程序在打印結(jié)果的時(shí)候是從最內(nèi)層函數(shù)開(kāi)始打印,于是,就得到136.因?yàn)檫f歸調(diào)用其實(shí)是嵌套調(diào)用,只是嵌套的是函數(shù)自身。這樣,需要將最內(nèi)層的函數(shù)執(zhí)行完畢,才開(kāi)始執(zhí)行外層的,一層一層往外執(zhí)行完畢,最后是main函數(shù)。若將遞歸還原為順序程序,流程是這樣:樓主得到的631其實(shí)是從6開(kāi)始被存放到某堆棧中的,這樣,1便成為最頂上的數(shù),而6成為最底部的數(shù)。而最后打印的時(shí)候,需要彈棧,出棧順序?yàn)椋鹤皂斚蛳鲁鰲#谑?,得到的結(jié)果為136樓主的解題過(guò)程是對(duì)的,但可能沒(méi)理解遞歸的意義。建議樓主翻閱關(guān)于遞歸的相關(guān)文章看看。
舉一個(gè)用遞歸調(diào)用函數(shù)求輸入非負(fù)整數(shù)的階乘的例子,如下:
//#include?"stdafx.h"http://If?the?vc++6.0,?with?this?line.
#include?"stdio.h"
int?fact(int?n){
if(n==1?||?n==0)?return?1;
else?return?n*fact(n-1);
}
int?main(void){
int?x;
while(1){
printf("Input?x(int?12=x=0)...\nx=");
if(scanf("%d",x),x=0??x=12)//x12時(shí)會(huì)使結(jié)果溢出
break;
printf("Error,redo:?");
}
printf("%d!?=?%d\n",x,fact(x));
return?0;
}
這是漢諾塔吧。
原理:(總共n個(gè)盤(pán)子)
1、將第一個(gè)位置(起始位置)上的n-1個(gè)盤(pán)子移到第二個(gè)位置上,此時(shí)第一個(gè)位置只剩第n個(gè)盤(pán)子
2、將第一個(gè)位置上的最后一個(gè)盤(pán)子(第n個(gè)盤(pán)子)移到第三個(gè)位置(目標(biāo)位置)上,再將第二個(gè)位置上的n-1個(gè)盤(pán)子移到第三個(gè)位置上。
你不需要曉得n-1個(gè)盤(pán)子如何從一個(gè)位置移到另一個(gè)位置,讓程序做。n--n-1--n-2......1,問(wèn)題不斷的小化,當(dāng)n=1時(shí),直接從第一個(gè)位置移到第三個(gè)位置,再倒過(guò)來(lái)推1--2--3......--n。最終問(wèn)題就會(huì)被解決。
hanoi()函數(shù)就是將問(wèn)題小化,使n--1
move()函數(shù)中char x是起始位置,char y是目標(biāo)位置,即x--y.用A、B、C來(lái)顯示盤(pán)子是如何移動(dòng)的