洛谷【C++編程基礎(chǔ)】遞歸函數(shù)初步專題解題報(bào)告-創(chuàng)新互聯(lián)

洛谷【C++編程基礎(chǔ)】遞歸函數(shù)初步 專題解題報(bào)告 T1-T89304 遞歸求和

題目描述
用遞歸的方法求1+2+3+4+…+(n-1)+n的值。
輸入格式
一個(gè)整數(shù)n。(1<=n<=10000).
輸出格式
一個(gè)整數(shù),數(shù)列的和。
輸入輸出樣例
輸入
10
輸出
55

創(chuàng)新互聯(lián)企業(yè)建站,十余年網(wǎng)站建設(shè)經(jīng)驗(yàn),專注于網(wǎng)站建設(shè)技術(shù),精于網(wǎng)頁(yè)設(shè)計(jì),有多年建站和網(wǎng)站代運(yùn)營(yíng)經(jīng)驗(yàn),設(shè)計(jì)師為客戶打造網(wǎng)絡(luò)企業(yè)風(fēng)格,提供周到的建站售前咨詢和貼心的售后服務(wù)。對(duì)于網(wǎng)站設(shè)計(jì)、做網(wǎng)站中不同領(lǐng)域進(jìn)行深入了解和探索,創(chuàng)新互聯(lián)在網(wǎng)站建設(shè)中充分了解客戶行業(yè)的需求,以靈動(dòng)的思維在網(wǎng)頁(yè)中充分展現(xiàn),通過對(duì)客戶行業(yè)精準(zhǔn)市場(chǎng)調(diào)研,為客戶提供的解決方案。

題目出處
題目要求:用遞歸的方法求1+2+3+4+…+(n-1)+n的值。

#includeusing namespace std;

int f(int a){if(a==1)return 1;//邊界
    return (a+f(a-1));//遞歸關(guān)系式
}

int main(){int n;
    cin>>n;
    cout<
T2-T89307 Hermite多項(xiàng)式

題目描述
用遞歸的方法求Hermite多項(xiàng)式的值
對(duì)給定的實(shí)數(shù)x和正整數(shù)n,求多項(xiàng)式值。
中間的Hermite圖片
輸入格式
兩個(gè)數(shù)x,n。用空格隔開。(-1輸出格式
一個(gè)數(shù),函數(shù)值。(保留兩位小數(shù))
輸入輸出樣例
輸入
-0.10 1
輸出
-0.20

題目出處
遞歸關(guān)系式已經(jīng)給出來了,照著寫唄。

#includeusing namespace std;

double n,x;//注意數(shù)據(jù)類型

double f(double n,double x){if(n==0)return 1;
	if(n==1)return 2*x;
	return 2*x*f(n-1,x)-2*(n-1)*f(n-2,x);//照著圖片寫唄
}

int main(){cin>>x>>n;
	cout<
T3-T89310 遞歸函數(shù)求值1

題目描述
已知圖片
用遞歸方法求解。
輸入格式
一行有兩個(gè)整數(shù)x和n,用空格隔開。(1輸出格式
一個(gè)實(shí)數(shù),即函數(shù)值。(保留兩位小數(shù))
輸入輸出樣例
輸入
24499 8564
輸出
2.86

題目出處
這一題比上一題略麻煩一點(diǎn)兒,要自己分析。
遞歸關(guān)系:f(x,n)=[n+f(n-1)]/x
邊界:n=1時(shí) return (1+x)/x
(或:當(dāng)n=0時(shí)return x)

#includeusing namespace std;

int n,x;

double f(double x,double n){if(n==1)return x/(1+x);
	return x/(n+f(x,n-1));
}

int main(){cin>>x>>n;
	cout<
T4-T89314 遞歸函數(shù)求值2

題目描述
已知
圖片
根據(jù)x,n的值計(jì)算函數(shù)值。
輸入格式
用空格隔開的兩個(gè)數(shù),實(shí)數(shù)x(0輸出格式
函數(shù)值。保留兩位小數(shù)。
輸入輸出樣例
輸入
4.2 10
輸出
3.68

題目出處
遞歸關(guān)系:f(x,n)=sqrt(n+f(x,n-1))
邊界:當(dāng)n=1時(shí)return sqrt(1+x)
(或:當(dāng)n=0時(shí)return x)

#includeusing namespace std;

float n,x;

double f(double x,double n){if(n==1)return sqrt(1+x);
	return sqrt(n+f(x,n-1));
}

int main(){cin>>x>>n;
	cout<
T5-T89316 漢諾塔問題

題目描述
如圖,設(shè)有n個(gè)大小不等的中空?qǐng)A盤,按照從小到大的順序迭套在立柱A上,另有兩根立柱B和C?,F(xiàn)要求把全部圓盤從A柱(源柱)移到C柱(目標(biāo)柱),移動(dòng)過程中可借助B柱(中間柱)。移動(dòng)時(shí)有如下的要求:
1、一次只許移動(dòng)一個(gè)盤。
2、任何時(shí)候任何柱子上不允許把大盤放在小盤上邊。
3、可使用任意一根立柱暫存圓盤。
問:如何用最少步數(shù)實(shí)現(xiàn)n個(gè)盤子的移動(dòng),請(qǐng)打印出方案。
輸入格式
一個(gè)整數(shù)n(3<=n<=16)
輸出格式
輸出移動(dòng)最少的方案,每行表示一次移動(dòng),如A->B表示將A柱上最上面的圓盤移動(dòng)到B柱上。
最后一行輸出最少的步數(shù)。
圖片
輸入輸出樣例
輸入
3
輸出
A->C
A->B
C->B
A->C
B->A
B->C
A->C
7

題目出處

其實(shí),可以將移動(dòng)n個(gè)圓盤到目標(biāo)柱理解為將(n-1)個(gè)圓盤移動(dòng)到中間柱+移動(dòng)第n個(gè)到目標(biāo)柱+將(n-1)個(gè)圓盤移動(dòng)到目標(biāo)柱
也就是(遞歸關(guān)系式)

hanot(n-1,a,c,b);//(n-1)個(gè)圓盤移動(dòng)到中間柱
cout<"<

邊界

if(n==1)將這根柱子移動(dòng)到目標(biāo)柱

由于題目要步數(shù),就設(shè)成了有返回值的(也可以定義全局變量替代)

#includeusing namespace std;

int n;

int hanot(int n,char a,char b,char c){//a目標(biāo)柱,b中間柱,c目標(biāo)柱
	if(n==1){cout<"<"<cin>>n;
	cout<
T6-T90615 字符串逆序

題目描述
輸入一串以‘!’結(jié)束的字符,按逆序輸出。(請(qǐng)用遞歸完成)
輸入格式
一行字符串(以!結(jié)束)(字符串長(zhǎng)度不超過100)
輸出格式
逆序輸出。
輸入輸出樣例
輸入
abc!
輸出
!cba

題目出處
這是我一開始的程序:

#includeusing namespace std;

string s;

string f(string s){int pos=s.size();
	if(pos==1)return s;
	char er=s[pos-1];
	string st;
	for(int i=0;icin>>s;
	cout<

現(xiàn)在發(fā)現(xiàn)太繁瑣:

#includeusing namespace std;

string s;
int pos;//全局變量,以便用于遞歸(當(dāng)然,可以通過傳參代替)

void f(int n){if(ncin>>s;
	pos=s.size();
	f(0);
	cout<

呸呸,更正?。?!
測(cè)試數(shù)據(jù)太弱了,竟然沒測(cè)出BUG!??!
(將

cin>>s;

改為

getline(cin,s);


當(dāng)然,還可以這樣做:

#includeusing namespace std;

int pos;

void f(){char fox;
	cin>>fox;
	if(fox=='!'){cout<<"!";
		return;
	}//邊界
	f();
	cout<f();
	cout<

但注意?。。∵@個(gè)的BUG也是不能輸入空格。將

cin>>fox;

改為

fox=getchar();

即可。

T7-T90627 費(fèi)波那契數(shù)列

1,1,2,3,5,8,13,…
這是著名的斐波那契(Leonardo Pisano ,Fibonacci, Leonardo Bigollo,1175-1250)發(fā)現(xiàn)的數(shù)列。其中,每?jī)身?xiàng)都等于前二項(xiàng)之和(第1,2項(xiàng)是1)。

題目描述
1,1,2,3,5,8,13,21,34,55……從第三項(xiàng)起,每一項(xiàng)都是緊挨著的前兩項(xiàng)的和。
以上就是斐波那契數(shù)列。
輸入第幾項(xiàng),輸出第幾項(xiàng)的值。(請(qǐng)用遞歸完成)
輸入格式
一個(gè)正整數(shù)n,<=30
輸出格式
第n項(xiàng)的值
輸入輸出樣例
輸入
4
輸出
3

題目出處
遞歸關(guān)系:f(n)=f(n-1)+f(n-2)
邊界:當(dāng)n==1或2時(shí)return 1
代碼

#includeusing namespace std;

long long n,dp[110];//dp為記憶化數(shù)組,以空間換時(shí)間(當(dāng)然本題數(shù)據(jù)較小,可以不用記憶化,并且可以不開long long)

long long f(long long n){if(n<=2){return 1;
	}//邊界
	if(dp[n])return dp[n];
	dp[n]=f(n-1)+f(n-2);
	return dp[n];
} 

int main(){cin>>n;
	cout<

當(dāng)然,還得展示一下我個(gè)人的奇葩代碼,思路奇怪。(簡(jiǎn)直不能說是遞歸)像函數(shù)實(shí)現(xiàn)for循環(huán)

#includeusing namespace std;

int n,s=2;

int f(int a,int b){++s;
	int c=a+b;
	if(s==n)return c;
	return f(b,c);
}

int main(){cin>>n;
	if(n==1||n==2)cout<<1<

當(dāng)然,再展示一下for循環(huán)代碼

#includeusing namespace std;

long long n,dp[110];

int main(){cin>>n;
	dp[1]=dp[2]=1;
	for(int i=3;i<=n;++i)dp[i]=dp[i-1]+dp[i-2];
	cout<
T8-T90628 F91

題目描述
麥卡錫是一個(gè)有名的計(jì)算機(jī)科學(xué)專家,在他的著作中,他定義了一個(gè)被稱為"F91"的遞歸函數(shù),這個(gè)函數(shù)是這樣獲得的:輸入一個(gè)正整數(shù)N,按如下定義返回一個(gè)正整數(shù):
If N ≤ 100, then f91(N) = f91(f91(N+11));
If N ≥ 101, then f91(N) = N-10
編寫程序計(jì)算出麥卡錫的F91函數(shù)
輸入格式
輸入數(shù)據(jù)包含一系列的正整數(shù),每個(gè)正整數(shù)大不超過1,000,000,每個(gè)正整數(shù)占一行,當(dāng)遇到數(shù)字0時(shí)表示輸入結(jié)束。注意數(shù)字0不是測(cè)試數(shù)據(jù),僅代表結(jié)束標(biāo)志。
輸出格式
輸出數(shù)據(jù)每行應(yīng)包含一個(gè)測(cè)試結(jié)果,具體格式見輸出樣例,等號(hào)兩側(cè)各有一個(gè)空格。
輸入輸出樣例
輸入
91
622
1997
0
輸出
f91(91) = 91
f91(622) = 612
f91(1997) = 1987
說明/提示
輸入數(shù)據(jù)保證你用直接遞歸不會(huì)超時(shí)。

題目出處
既然題目給出了遞歸關(guān)系式,并保證“直接遞歸不會(huì)超時(shí)”,那就寫唄。

#includeusing namespace std;

int s=1;

int f(int s){if(s<=100)return f(f(s+11));//遞歸關(guān)系
	return s-10;
}
int main(){while(s!=0){cin>>s;
		if(s!=0){	cout<<"f91("<
T9-T90630 大公約數(shù)與最小公倍數(shù)

題目描述
輸入兩個(gè)數(shù),求他們的大公約數(shù)和最小公倍數(shù)。(請(qǐng)用遞歸完成)
輸入格式
輸入一行,兩個(gè)正整數(shù)。
輸出格式
輸出一行,兩個(gè)正整數(shù)(這兩個(gè)正整數(shù)的大公約數(shù)和最小公倍數(shù)),用一個(gè)空格隔開。
輸入輸出樣例
輸入
18 20
輸出
2 180
說明/提示
所有數(shù)據(jù)保證小于2^31-1

題目出處
既然是大公約數(shù),肯定用“輾轉(zhuǎn)相除法”。不了解的同學(xué)推薦看這篇C++輾轉(zhuǎn)相除法詳解,而大公倍數(shù)就是(設(shè)大公約數(shù)為x)(a/x)*(b/x)x=ab/x??梢詤⒖歼@篇大公約數(shù)和最小公倍數(shù)的關(guān)系。
這題要遞歸實(shí)現(xiàn)(平常用的是迭代實(shí)現(xiàn))
遞歸關(guān)系:f(a,b)=f(b,a%b)
邊界:b==0時(shí)return a
附上我一開始的代碼:

#includeusing namespace std;

int f(int a,int b){int c=b;
    b=a%b;
    a=c;
    if(b==0)return a;
    return f(a,b);
}
int main(){int n,a;
    cin>>n>>a;
    cout<

發(fā)現(xiàn)一種簡(jiǎn)潔優(yōu)美的寫法:(不會(huì)"? : "的同學(xué)可以看這篇C++中“?”的意思)

#includeusing namespace std;

long long a,b;

long long f(long long a,long long b){return b?f(b,a%b):a;
}

int main(){cin>>a>>b;
	cout<
T10-T90632 十進(jìn)制轉(zhuǎn)八進(jìn)制

題目描述
把任一給定的十進(jìn)制正整數(shù)(<=32000)轉(zhuǎn)換成八進(jìn)制數(shù)后輸出。(請(qǐng)用遞歸完成)
輸入格式
一個(gè)十進(jìn)制數(shù)。
輸出格式
轉(zhuǎn)換后的八進(jìn)制數(shù)
輸入輸出樣例
輸入
100
輸出
144

題目出處
額……先來演示一下通常做法:

#includeusing namespace std;

long long a,b,i=1;

int main(){cin>>a;
	while(a>0){b+=a%8*i;
		a/=8;
		i*=10;//算位權(quán)
	}
	cout<

簡(jiǎn)潔吧。。。下一步演示遞歸:

#includeusing namespace std;

int f(int n){if(n<8)return n;//也可以將邊界改為0
	return n%8+f(n/8)*10;
}

int main(){int n;
	cin>>n;
	cout<

還可以這么做

#includeusing namespace std;

void f(int n){if(n/8)f(n/8);
	cout<int n;
	cin>>n;
	f(n);
	return 0;
}
T11-T90633 走臺(tái)階

題目描述
樓梯有n階臺(tái)階,上樓可以一步上一階,也可以一步上二階。用遞歸的方法編一程序計(jì)算共有多少種不同的走法。(試用遞歸完成,會(huì)出現(xiàn)什么問題,如何解決)
輸入格式
一個(gè)正整數(shù)n(n不超過90)
輸出格式
一個(gè)整數(shù),表示走法方案數(shù)。
輸入輸出樣例
輸入
4
輸出
5

題目出處
我第一秒想到的是暴力……(造化低了)33分

#includeusing namespace std;

int n,cnt;

void f(int s){if(s==n){++cnt;
		return;
	}
	if(s>n)return;
	for(int i=1;i<=2;++i)
		f(s+i);
	return;
}

int main(){cin>>n;
	f(0);
	cout<

仔細(xì)對(duì)比數(shù)據(jù),竟發(fā)現(xiàn)答案是斐波那契數(shù)列!??!
自制奇葩遞歸

#includeusing namespace std;

long long n,ans,vh[100];

void f(int s){if(s<3){if(s==2)cout<<3<cout<vh[0]=1;//這一行加上只是為了對(duì)比發(fā)現(xiàn)斐波那契,可刪除
	vh[1]=1;
	vh[2]=2;
	cin>>n;
	f(3);
	return 0;
}

標(biāo)程:

#includeusing namespace std; 

long long dp[110];//記憶化
long long f(long long n){if(dp[n])return dp[n];
	if(n<=2)return n;//注意這個(gè)地方與標(biāo)準(zhǔn)斐波那契不同(因?yàn)檫@一題第n個(gè)答案是第(n+1)個(gè)斐波那契數(shù),忘記的同學(xué)可以向上翻翻T7,這里原是return 1)
	else dp[n]=f(n-1)+f(n-2);
	return dp[n];
}

int main(){int n;
	cin>>n;
	cout<

刨根問底的同學(xué)可以繼續(xù)看:
QUESTION:為什么答案是斐波那契數(shù)列?
ANSWER:上面我們用的是歸納的方法。下面主要介紹原因:
第1,2個(gè)臺(tái)階分別有1,2種走法(1)(1+1或2)
而從第3個(gè)開始,每一個(gè)數(shù)目(假設(shè)是第n個(gè)(n>2))都可以理解為第(n-1)的走法再走1級(jí)臺(tái)階或第(n-2)的走法再走2級(jí)臺(tái)階,自然就有第(n-1),第(n-2)的走法總數(shù)和數(shù)量的方法。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級(jí)流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級(jí)服務(wù)器適合批量采購(gòu),新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧

網(wǎng)站題目:洛谷【C++編程基礎(chǔ)】遞歸函數(shù)初步專題解題報(bào)告-創(chuàng)新互聯(lián)
網(wǎng)站路徑:http://bm7419.com/article2/igpic.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供標(biāo)簽優(yōu)化、手機(jī)網(wǎng)站建設(shè)動(dòng)態(tài)網(wǎng)站、移動(dòng)網(wǎng)站建設(shè)、網(wǎng)站制作關(guān)鍵詞優(yōu)化

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)