C语言作业五——递归函数的运用

作业:

#include <iostream>

#include <math.h>

using namespace std;

/* run this program using the console pauser or add your own getch, system("pause") or input loop */

//1.设计一个函数,根据三角形的三边长计算出三角形面积,注意函数的健壮性

double t(double a,double b,double c)

{   

     double s,p;

     if(a+b>c && a+c>b && b+c>a)//判断是否构成三角形

     {

           p=(a+b+c)/2;

           s=sqrt(p*(p-a)*(p-b)*(p-c));

           cout<<"此三角形的面积为:"<<s<<endl;

           return true;

     }

     else

     cout<<"这三边构不成三角形"<<endl;

     return false;

}

int main(int argc, char** argv) {

     double a,b,c,s;

     cout<<"请输入任意三边长:";

     cin>>a>>b>>c;

     cout<<t(a,b,c)<<endl;

     return 0;

}

//2.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。

//这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?

//经过每个村子卖出多少只鸭子??利用递归函数来实现该算法。

int duck(int vil)

{

     if(vil==8)

           return 2;

     else

           return duck(vil+1)*2+2;//递归

    

}

int main(int argc, char** argv) {

     cout<<duck(1)<<endl;

     return 0;

}

//3.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。

//经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。

//利用递归函数来实现该算法。

int m=0;

void f(int n)

{   

     if(n==1)

     {

           cout<<n<<"\t";

           cout<<"共"<<m<<"次"<<endl;

           return;

     }

     else if(n%2==0)

     {

           cout<<n<<"\t";

           m++;

           f(n/2);

     }

     else

     {

           cout<<n<<"\t";

           m++;

           f(n*3+1);

     }

}

    

int main(int argc, char** argv) {

     int n,m;

     cout<<"请输入一个自然数:";

     cin>>n;   

     f(n);

     return 0;

}

    

    

    

#include <iostream>
#include <math.h>
using namespace std;
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
//1.设计一个函数,根据三角形的三边长计算出三角形面积,注意函数的健壮性
double t(double a,double b,double c)
{	
	double s,p;
	if(a+b>c && a+c>b && b+c>a)//判断是否构成三角形 
	{
		p=(a+b+c)/2;
		s=sqrt(p*(p-a)*(p-b)*(p-c));
		cout<<"此三角形的面积为:"<<s<<endl; 
		return true;
	}
	else 
	cout<<"这三边构不成三角形"<<endl; 
	return false;
}

int main(int argc, char** argv) {
	double a,b,c,s;
	cout<<"请输入任意三边长:";
	cin>>a>>b>>c;
	cout<<t(a,b,c)<<endl;
	return 0;
}
//2.一个人赶着鸭子去每个村庄卖,每经过一个村子卖去所赶鸭子的一半又一只。
//这样他经过了七个村子后还剩两只鸭子,问他出发时共赶多少只鸭子?
//经过每个村子卖出多少只鸭子??利用递归函数来实现该算法。
int duck(int vil)
{
	if(vil==8)
		return 2;
	else
		return duck(vil+1)*2+2;//递归 
	
}
 
int main(int argc, char** argv) {
	cout<<duck(1)<<endl;
	return 0;
}
//3.角谷定理。输入一个自然数,若为偶数,则把它除以2,若为奇数,则把它乘以3加1。
//经过如此有限次运算后,总可以得到自然数值1。求经过多少次可得到自然数1。
//利用递归函数来实现该算法。
int m=0;
void f(int n)
{	
	if(n==1)
	{
		cout<<n<<"\t";
		cout<<"共"<<m<<"次"<<endl; 
		return; 
	}
	else if(n%2==0)
	{
		cout<<n<<"\t";
		m++;
		f(n/2);
	}
	else
	{
		cout<<n<<"\t";
		m++;
		f(n*3+1);
	}
}
	
int main(int argc, char** argv) {
	int n,m;
	cout<<"请输入一个自然数:"; 
	cin>>n;	
	f(n);
	return 0;
}
	
	
	

总结:

太感人了!!!表现在两点:

1.时间上终于缩短了不少,也就是说效率高了很多,之前也大概这个量的作业需要5-6个小时甚至更多,这次作业大概只花了2个多小时;

2.终于可以自己写出代码了!(不过写出来还是很多错,最后还是要去参考找错…(〃´-ω-) )

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值