1. 程式人生 > >遞迴練習題

遞迴練習題

題目:編寫一個函式求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;
 }