递归练习题

题目:编写一个函数求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;
 } 

猜你喜欢

转载自blog.csdn.net/weixin_42617472/article/details/83352646