实验10 函数的嵌套和递归调用

6-1 递归计算Ackermenn函数 (25分)

本题要求实现Ackermenn函数的计算,其函数定义如下:

函数接口定义:
int Ack( int m, int n );
其中m和n是用户传入的非负整数。函数Ack返回Ackermenn函数的相应值。题目保证输入输出都在长整型

范围内。

裁判测试程序样例:
#include <stdio.h>

int Ack( int m, int n );

int main()
{
int m, n;

scanf("%d %d", &m, &n);
printf("%d\n", Ack(m, n));

return 0;

}

/* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
9

int Ack(int m,int n)
{
	int k;
	if(m==0)
		k=n+1;
	if(n==0&&m>0)
		k=Ack(m-1,1);
	if(m>0&&n>0)
		k=Ack(m-1,Ack(m,n-1));
	return k;
}

6-2 递归求Fabonacci数列 (25分)

本题要求实现求Fabonacci数列项的函数。Fabonacci数列的定义如下:

f(n)=f(n−2)+f(n−1) (n≥2),其中f(0)=0,f(1)=1。

函数接口定义:
int f( int n );
函数f应返回第n个Fabonacci数。题目保证输入输出在长整型范围内。建议用递归实现。

裁判测试程序样例:
#include <stdio.h>

int f( int n );

int main()
{
int n;

scanf("%d", &n);
printf("%d\n", f(n));

return 0;

}

/* 你的代码将被嵌在这里 */
输入样例:
6
输出样例:
8

int f(int n)
{
	int s;
	if(n==0) 
		s=0;
    else if(n==1)
		s=1;
	else
		s=f(n-2)+f(n-1);
	return s;
	
}

6-3 递归求阶乘和 (15分)

本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 1!+2!+3!+…+n! 的值。

函数接口定义:
double fact( int n );
double factsum( int n );
函数fact应返回n的阶乘,建议用递归实现。函数factsum应返回 1!+2!+…+n! 的值。题目保证输入输出在双精度范围内。

裁判测试程序样例:
#include <stdio.h>

double fact( int n );
double factsum( int n );

int main()
{
int n;

scanf("%d",&n);
printf("fact(%d) = %.0f\n", n, fact(n));
printf("sum = %.0f\n", factsum(n));
	
return 0;

}

/* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
fact(10) = 3628800
sum = 4037913
输入样例2:
0
输出样例2:
fact(0) = 1
sum = 0

double fact(int n)
{
	double x;
	if(0==n)
		return 1;
	else
		x=fact(n-1)*n;
	return x;
}
double factsum(int n)
{
	int s=0,i;
	for(i=1;i<=n;i++)
		s+=fact(i);
	return s;
}

6-4 统计平均分,最高分及得最高分人数 (35分)

请编写一个函数fun,函数的功能是:统计出若干个学生的平均成绩,最高分以及得最高分的人数。

函数接口定义:
float fun(float array[],int n);
其中 array 和 n 都是用户传入的参数。函数须统计 array数组中学生的平均成绩,最高分以及得最高分的人数,函数返回平均成绩,最高分以及得最高分的人数存放在全局变量 Max 和 J中 。

裁判测试程序样例:
#include <stdio.h>
float Max=0;
int J=0;
float fun(float array[],int n);
int main()
{
float a[10],ave;
int i=0;
for(i=0;i<10;i++)
scanf("%f",&a[i]);
ave=fun(a,10);
printf(“ave=%.2f\n”,ave);
printf(“max=%.02f\n”,Max);
printf(“Total:%d\n”,J);
return 0;
}

/* 请在这里填写答案 */
输入样例:
84 75 86 59 25 94 76 84 15 65
输出样例:
ave=66.30
max=94.00
Total:1

float fun(float array[],int n)
{
	double f;
	int i,j=0;
	for(i=0;i<n;i++)
		f+=array[i];
	f=f/n;
	for(i=1;i<n;i++)
	{
		if(array[j]<array[i])
			j=i;
	}
	Max=(int)array[j];
	for(i=0;i<n;i++)
		if(Max==(int)array[i])
			J++;
	return f;
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值