CPP2022-14-递归

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应返回xn次幂的值。建议用递归实现。题目保证结果在双精度范围内。

裁判测试程序样例:

 

#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 );

其中mn是用户传入的非负整数。函数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 为金片数,srcdst 和 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;
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值