bupt2024大一上计导递归练习

6-8 实验6_1_递归求值一

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

现有函数f(n),n为大于等于0的整数。当n等于0时f(n) = 0,当n大于0时 f(n)=f(n-1) +n3

注意:此题要求用递归求解,且不允许使用全局变量,否则没有分。

函数接口定义:

 

int fuc(int n) ;

其中 n 是用户传入的参数。 n 的值不超过200。函数的返回值为对应的f(n)的计算结果。

裁判测试程序样例:

 

#include<stdio.h> int fuc(int n) ; int main() { int n ; scanf("%d",&n); printf("%d\n",fuc(n)); return 0 ; } /* 请在这里填写答案 */

输入样例:

2

输出样例:

9

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int fuc(int n)
{
    int res;
    if(n == 0)
    {
        res = 0;
    }
    else
    {
        res = fuc(n-1) + n*n*n;
    }
    return res;
}

6-9 实验6_2_递归求值二

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

现有序列: s = a + a + 3 + a + 6 +…+ a + 3 X n

请写出递归求s的程序。

输入只有一行,为两个用空格分隔正整数,分别代表n(0<n) 和 a(1<a)

输出也只有一行,为此情况下s的值。(测试用例保证所有整数可以用 int存储)。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:

 

int getSum(int n , int a) ;

其中 na 都是用户传入的参数。 函数须计算结果。

裁判测试程序样例:

 

#include <stdio.h> int getSum(int n , int a) ; int main() { int n , a ; scanf( "%d%d" , &n , &a ); printf( "%d\n" , getSum( n , a ) ); return 0; } /* 请在这里填写答案 */

输入样例:

1 2

输出样例:

7

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int getSum(int n , int a)
{
    int s;
    if(n==1)
    {
        s = a + a + 3;
    }
    else if(n>1)
    {
        s = getSum(n-1,a) + a + 3*n;
    }
    return s;
}

6-10 实验6_3_递归求最大值

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

写一个函数可以读入n(0<n<100)个整数,并求出这n个整数中的最大值。

此题要求递归求解,且不允许使用全局变量。在此题的所有提交中只要出现非递归提交,无论其他提交是否是递归求解此题均为0分。

函数接口定义:

 

int findMax(int n) ;

其中 n 是用户传入的参数。 n 的值大于0且小于100; 函数须返回 读入的n个整数中最大的那个数。

裁判测试程序样例:

 

#include <stdio.h> int findMax(int n) ; int main() { int n ; scanf("%d", &n); printf("%d\n" , findMax( n ) ) ; return 0; } /* 请在这里填写答案 */

输入样例:

6
15  30  34  10  89 5

输出样例:

89

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int findMax(int n)
{
    int x;
    scanf("%d", &x);

    if(n==1)
    {
        return x;
    }
    else if(n>1)
    {
        int max = findMax(n-1);
        return max>x?max:x;
    }
}

6-11 实验6_4_二进制转十进制

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

设计递归函数int convert(int n);用于将二进制数n转换为十进制数并返回。
递归函数设计思路与提示:
如将1101转换为十进制的形式:

1101=1 * 20 + 0 * 21 + 1 * 22 + 1 * 23 = 1101 % 10 + convert(110) * 2 ;

110 = 0 * 20 + 1 * 21 + 1 * 22 = 110 % 10 + convert(11) * 2;

11 = 1 * 20 + 1 * 21 = 11 % 10 + convert(1) * 2 ;

convert(1) = 1 ;

所以得到以下结论:当n==0或n==1时,函数返回n,否则返回n%10+convert(n/10)*2 。

输入与输出要求:
输入一个整数n,代表二进制数,其长度不大于10。输出转换后的十进制数,占一行。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:

int convert(int n);

其中 n 是用户传入的参数。 n 的长度不大于10;函数的返回值为转换后的十进制数。

裁判测试程序样例:

#include<stdio.h>

int convert(int n);

int main()
{
    int        n ;
    
    scanf("%d",&n);

    printf("%d\n",convert(n)) ;
    return 0 ;    
}

/* 请在这里填写答案 */

输入样例:

101010

输出样例:

42

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int convert(int n)
{
    int res;
    if(n==1||n==0)
    {
        res = n;
    }
    else
    {
        res = n%10 + convert(n/10)*2;
    }
    return res;
}

6-12 实验6_5_二进制的位数

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

设计递归函数int countBinary(int n); 用于将非负十进制整数n转换成二进制形式,并返回该二进制数的位数。如十进制数13的二进制形式为1101,位数为4,那么调用countBinary(13)的结果为4。

要求同学们先写出该问题的递归定义式,再设计递归函数。

输入与输出要求:
输入一个非负整数n。输出求得的结果,如输入“13”,输出“4”,占一行。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:

int countBinary(int n);

其中 n 是用户传入的参数。 n 的值不超过int的范围。函数的返回值为 n的二进制形式的位数。

裁判测试程序样例:

#include<stdio.h>

int countBinary(int);

int main()
{
    int        n;
    
    scanf("%d",&n);
    printf("%d\n",countBinary(n));
    
    return 0 ;
}

/* 请在这里填写答案 */

输入样例:

13

输出样例:

4

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int countBinary(int n)
{
    int count = 0;
    if(n==1||n==0)
    {
        return 1;
    }
    else
    {
        return 1 + countBinary(n/2);
    }
}

6-13 实验6_6_数列求值

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

现有序列: s = 1 + a + a2 +…+ an+1

其中a>0,n>0,且均为整数。 测试用例保证所有整数可以用int存储。
请写出递归求s的函数。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:

int evaluation(int n,int a);

其中 na 都是用户传入的参数,分别代表数列中的n和a,返回值为所求结果。

裁判测试程序样例:

#include <stdio.h>

int    evaluation(int n,int a) ;
int main()
{
       int        n , a ; 
       
       scanf("%d%d",&n,&a);       
       printf("%d\n",evaluation(n,a));

    return 0;
}

/* 请在这里填写答案 */

输入样例:

1 2

输出样例:

7

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <math.h>

int evaluation(int n, int a)
{
    if(n==1)
    {
        return 1+a+a*a;
    }
    else{
        return evaluation(n-1,a)+(int)pow(a,n+1);
    }
}

6-14 实验6_7_最大公约数

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

设计递归函数int GCD(int a,int b);计算正整数a和b的最大公约数并返回。如GCD(32,48)为16。

GCD(a,b)递归定义为:

GCD(a,b)=GCD(b,a MOD b) 当 a MOD b≠0

GCD(a,b)=b 当 a MOD b=0

输入与输出要求:
输入两个正整数a和b,输出两数的最大公约数,占一行。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:

int GCD(int a , int b );

其中 ab 都是用户传入的参数。ab 的值不超过int的范围。函数的返回值为ab 的最大公约数。

裁判测试程序样例:

#include<stdio.h>

int GCD(int a , int b );

int main()
{
    int        a , b ;
    
    scanf("%d%d", &a , &b );
    printf( "%d\n" , GCD( a, b ) ) ;
     
    return 0 ;    
}

/* 请在这里填写答案 */

输入样例:

32 48

输出样例:

16

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

int GCD(int a, int b)
{
    if(a%b==0)
    {
        return b;
    }
    else{
        return GCD(b,a%b);
    }
}

6-15 实验6_8_整数逆序输出

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

请写出将一个整数逆序输出的函数。

注意:此题要求递归求解且不允许使用数组,不允许使用全局变量。如果违反要求则没有分。

函数接口定义:

void reverse(int n) ;

其中 n 是用户传入的参数。 n 的值大于0且不超过int的范围; 函数的返回值为空,其功能是逆序输出 n。测试用例保证输入的n末尾不为0。

裁判测试程序样例:

#include <stdio.h>

void reverse(int n) ; 

int main()
{
    int     n;
         
    scanf("%d",&n);
    reverse(n) ;
    printf("\n");
    return 0;
}

/* 请在这里填写答案 */

输入样例:

1234

输出样例:

4321

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void reverse(int n)
{
    if(n/10==0){
        printf("%d", n);
    }
    else{
        printf("%d", n%10);
        reverse(n/10);
    }
}

6-16 实验6_9_素数分解

分数 100

全屏浏览

切换布局

作者 scs

单位 北京邮电大学

设计递归函数void void printFactor( int, int );打印出对n进行素数分解的结果。

当执行void printFactor(60,1)时,打印效果为:

60=2*2*3*5。

关于素数分解的描述,见讲义。

设计程序,已知一段数据范围[a,b],且a<=b,要求对其中的每一个数进行素数分解。你也可以设计其它辅助函数,如判断素数的函数isPrime(n)。

输入与输出要求:
输入两个正整数a、b,代表所分解的区间,满足1<=a<=b<=100000,且b-a<=100。输出b-a+1行,即b-a+1个数的分解。

注意:此题要求递归求解,且不允许使用全局变量,其他方式不得分。

函数接口定义:

void printFactor( int, int ); 

其中第一个参数为待分解的整数,第二个参数需自行设计。函数无返回值。

裁判测试程序样例:

#include<stdio.h>

void printFactor( int, int ); 

int main()
{
    int a,b,i ;
    
    scanf( "%d%d", &a, &b );
    for( i = a ; i <= b ; i++ )
        printFactor( i , 1 ) ;    
    
    return 0;
}

/* 请在这里填写答案 */

输入样例:

100 105

输出样例:

100=2*2*5*5
101=101
102=2*3*17
103=103
104=2*2*2*13
105=3*5*7

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

void printFactor(int x, int y)
{
	if (y == 1)
	{
		if (x == 1)
			printf("%d=%d\n", x, x);
		else
			printf("%d=", x);
	}
	else if (x == 1)
	{
		printf("\n");
		return;
	}
	int i;
	for(i=2; i <= x; i++)
	{
		if (x % i == 0)
		{
			if (y == 1)
				printf("%d", i);
			else
				printf("*%d", i);
			return printFactor(x / i, 2);
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值