遞迴練習題
題目:編寫一個函式求n的階乘。
#include<iostream>
int Function(int n);
int main()
{
int n;
std::cin>>n;
int result=Function(n);
std::cout<<result;
}
int Function(int n)
{
if(n==0)
{
return 1;
}
else
return n*Function(n-1);
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目: 一個人趕著鴨子去每個村莊賣,每經過一個村子賣去所趕鴨子的一半又一隻。這樣他經過了七個村子後還剩兩隻鴨子,問他出發時共趕多少隻鴨子?經過每個村子賣出多少隻鴨子?
思路:在紙上寫出經過後幾個村子時賣出的鴨子數,就可看出規律。
#include<iostream> int duck(int num); int main() { int i=1; int count=0; for(i=1;i<=8;i++) { count=count+duck(i); std::cout<<"經過第"<<i<<"個村子時,賣出"<<duck(i)<<"只鴨子"<<"\n"; } std::cout<<"總共賣出了"<<count<<"只鴨子"<<std::endl; return 0; } int duck(int num) { if(num==8) return 2; return 2*duck(num+1); }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:題目:角谷定理。輸入一個自然數,若為偶數,則把它除以2,若為奇數,則把它乘以3加1。經過如此有限次運算後,總可以得到自然數值1。求經過多少次可得到自然數1。
#include<iostream> int Number(int result) { int count=0; while(result!=1) { if(result%2==0) { result=result/2; count++; std::cout<<"第"<<count<<"次的結果為:"<<result<<"\n"; } else { result=result*3+1; count++; std::cout<<"第"<<count<<"次的結果為:"<<result<<"\n"; } } } int main() { int result; Number(22); return 0; }
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:日本著名數學遊戲專家中村義作教授提出這樣一個問題:父親將2520個桔子分給六個兒子。分完後父親說:“老大將分給你的桔子的1/8給老二;老二拿到後連同原先的桔子分1/7給老三;老三拿到後連同原先的桔子分1/6給老四;老四拿到後連同原先的桔子分1/5給老五;老五拿到後連同原先的桔子分1/4給老六;老六拿到後連同原先的桔子分1/3給老大”。結果大家手中的桔子正好一樣多。問六兄弟原來手中各有多少桔子?
解析:
對於第一個孩子a[0]來說,是先給出,再得到;而其他的孩子都是先得到,再給出。
第二個孩子a[1]:(a[1]+left[1])*6/7=ave,所以a[1]=ave*7/6-left[1],而left[2]=(a[1]+left[1])/7=ave*7/6/7=ave/6;
第三個孩子a[2]:(a[2]+left[2])*5/6=ave,所以a[2]=ave*6/5-left[2],而left[3]=(a[2]+left[2])/6=ave*6/5/6=ave/5;
......
第一個孩子的left[0]=ave/2,所以a[0]*7/8+ave/2=ave,從而求出a[0];其他的5個則是有規律的(上方),求出即可。
#include<iostream>
int main()
{
int a[6];//存放最開始桔子的數目
int ave=420;//平均數
int i;
int left;//傳給下一個孩子的桔子數
for(i=0;i<6;i++)
{
if(i==0)
{
a[0]=(ave-ave/2)*(8-i)/(8-i-1);
left=a[0]/8;
}
else
{
a[i]=ave*(8-i)/(8-i-1)-left;
left=ave/(8-i-1);
}
}
for(i=0;i<6;i++)
{
std::cout<<a[i]<<"\t";
}
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:編寫一個函式,可以分別列印一個整數十進位制的每一位。
f(345)=f(34)+printf(5)=f(3)+printf(4)+printf(5)=printf(3)+printf(4)+printf(5)
#include<iostream>
void Function(int n)
{
if (n > 9)
{
Function(n / 10);
}
printf("%d\n", n % 10);
}
int main()
{
int n;
std::cin>>n;
Function(n);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:編寫一個函式實現n^k,使用遞迴實現。
#include<iostream>
int Function(int n,int k)
{
if(k==0)
return 1;
if(k==1)
return n;
else
return n*Function(n,k-1);
}
int main()
{
int n,k;
std::cin>>n;
std::cin>>k;
std::cout<<Function(n,k);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:不允許建立臨時變數求字串長度,實現strlen的模擬。
#include<iostream>
int Function(char *p)
{
if(*p==NULL)
{
return 0;
}
else
{
return 1+Function(p+1);
}
}
int main()
{
char *p="abc";
std::cout<<Function(p);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:編寫一個函式reverse_string(char * string)(遞迴實現)。
重要知識點:在函式中,如果碰到return 語句,那麼程式就會返回呼叫該函式的下一條語句執行,也就是說跳出函式的執行,回到原來的地方繼續執行下去。
#include<iostream>
void Function(char *p)
{
if(*(p+1)==NULL)
{
std::cout<<*p;
// std::cout<<"程式結束?";
return ;
}
//std::cout<<1;
Function(p+1);
//std::cout<<2;
std::cout<<*p;
}
int main()
{
char *p="abc";
Function(p);
return 0;
}
-------------------------------------------------------------------------------------------------------------------------------------------------------------------------
題目:寫一個遞迴函式DigitSum(n),輸入一個非負整數,返回組成它的數字之和。
解法1:
#include<iostream>
int sum=0;
int Function(int n)
{
if(n>=10)
{
Function(n/10);//不斷的除以10,得到個位,然後加到sum上
}
sum=sum+n%10;
return sum;
}
int main()
{
int n;
std::cin>>n;
std::cout<<Function(n);
return 0;
}
解法2:
#include<iostream>
int Function(int n)
{
if(n<10)
{
return n;
}
else
{
return(n%10+Function(n/10));//以兩位數為基本演算法,從而推出多位數
//多加的位數是在後邊加的,從而%10加上原來的即可。
}
}
int main()
{
int n;
std::cin>>n;
std::cout<<Function(n);
return 0;
}