6-1 使用递归函数计算1到n之和
分数 10
全屏浏览题目
切换布局
作者 张高燕
单位 浙大城市学院
本题要求实现一个用递归计算1+2+3+…+n的和的简单函数。
函数接口定义:
int sum( int n );
该函数对于传入的正整数n
返回1+2+3+…+n
的和;若n
不是正整数则返回0。题目保证输入输出在长整型范围内。建议尝试写成递归函数。
裁判测试程序样例:
#include <stdio.h> int sum( int n ); int main() { int n; scanf("%d", &n); printf ("%d\n", sum(n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例1:
10
输出样例1:
55
输入样例2:
0
输出样例2:
0
int sum( int n )
{
if(n==1)
{
return 1;
}
else if(n<=0)
{
return 0;
}
else
{
return n+sum(n-1);
}
}
6-2 递归求阶乘和
分数 10
全屏浏览题目
切换布局
作者 张高燕
单位 浙大城市学院
本题要求实现一个计算非负整数阶乘的简单函数,并利用该函数求 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 )
{
if(n<=1)
{
return 1;
}
else
{
return n*fact(n-1);
}
}
double factsum( int n )
{
long long int sum=0;
for(int i=1;i<=n;i++)
{
sum=sum+fact(i);
}
return sum;
}
6-3 递归实现指数函数
分数 10
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现一个计算xn(n≥1)的函数。
函数接口定义:
double calc_pow( double x, int n );
函数calc_pow
应返回x
的n
次幂的值。建议用递归实现。题目保证结果在双精度范围内。
裁判测试程序样例:
#include <stdio.h> double calc_pow( double x, int n ); int main() { double x; int n; scanf("%lf %d", &x, &n); printf("%.0f\n", calc_pow(x, n)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
2 3
输出样例:
8
迭代
double calc_pow( double x, int n )
{
double sum=1;
for(int i=0;i<n;i++)
{
sum=sum*x;
}
return sum;
}
递归
double calc_pow( double x, int n )
{
if(n==0)
{
return 1;
}
else
{
return x*calc_pow(x,n-1);
}
}
6-4 递归求Fabonacci数列
分数 10
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现求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 )
{
if(n<=1)
{
return n;
}
else
{
return f(n-1)+f(n-2);
}
}
6-5 十进制转换二进制
分数 10
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现一个函数,将非负整数n转换为二进制后输出。
函数接口定义:
void dectobin( int n );
函数dectobin
应在一行中打印出二进制的n
。建议用递归实现。
裁判测试程序样例:
#include <stdio.h> void dectobin( int n ); int main() { int n; scanf("%d", &n); dectobin(n); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
10
输出样例:
1010
void dectobin( int n )
{
if(n==0)
{
printf("0");
}
else if(n==1)
{
printf("1");
}
else
{
dectobin(n/2);
printf("%d",n%2);
}
}
6-6 递归计算P函数
分数 15
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现下列函数P(n,x)的计算,其函数定义如下:
函数接口定义:
double P( int n, double x );
其中n
是用户传入的非负整数,x
是双精度浮点数。函数P
返回P(n,x)函数的相应值。题目保证输入输出都在双精度范围内。
裁判测试程序样例:
#include <stdio.h> double P( int n, double x ); int main() { int n; double x; scanf("%d %lf", &n, &x); printf("%.2f\n", P(n,x)); return 0; } /* 你的代码将被嵌在这里 */
输入样例:
10 1.7
输出样例:
3.05
double P( int n, double x )
{
if(n==0)
{
return 1;
}
else if(n==1)
{
return x;
}
else
{
return ((2*n-1)*P(n-1,x)-(n-1)*P(n-2,x))/n;
}
}
6-7 递归计算Ackermenn函数
分数 15
全屏浏览题目
切换布局
作者 C课程组
单位 浙江大学
本题要求实现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 )
{
if(m==0)
{
return n+1;
}
else if(n==0&&m>0)
{
return Ack(m-1,1);
}
else if(m>0&&n>0)
{
return Ack(m-1,Ack(m,n-1));
}
}
6-8 汉诺塔问题
分数 20
全屏浏览题目
切换布局
作者 李祥
单位 湖北经济学院
汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着 64 片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。
请编写函数,完成移动汉诺塔的任务。
函数原型
void MoveTower(int num, char src, char dst, char trs);
说明:参数 num
为金片数,src
、dst
和 trs
分别为起始柱、目的柱和过渡柱。若金片数大于 0,则函数将金片组成的汉诺塔由起始柱利用过渡柱最终搬到目的柱,否则什么也不做。
下面的程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。
裁判程序
#include <stdio.h> void MoveTower(int num, char src, char dst, char trs); int main() { int n; char s, d, t; scanf("%d %c %c %c", &n, &s, &d, &t); MoveTower(n, s, d, t); return 0; } /* 你提交的代码将被嵌在这里 */
输入格式
圆盘数
起始柱 目的柱 过渡柱
输出格式
移动汉诺塔的步骤
每行显示一步操作,具体格式为:
盘片号: 起始柱 -> 目的柱
其中盘片号从 1 开始由小到大顺序编号。
输入样例
3
a c b
输出样例
1: a -> c
2: a -> b
1: c -> b
3: a -> c
1: b -> a
2: b -> c
1: a -> c
void MoveTower(int num, char src, char dst, char trs)
{
if(num==1)
{
printf("1: %c -> %c\n",src,dst);
return;
}
MoveTower(num-1,src,trs,dst);
printf("%d: %c -> %c\n",num,src,dst);
MoveTower(num-1,trs,dst,src);
return;
}