【C/PTA】函数专项练习(四)

本文结合PTA专项练习带领读者掌握函数,刷题为主注释为辅,在代码中理解思路,其它不做过多叙述。

目录

    • 6-1 计算A[n]=1/(1 + A[n-1])
    • 6-2 递归实现顺序输出整数
    • 6-3 自然数的位数(递归版)
    • 6-4 分治法求解金块问题
    • 6-5 汉诺塔
    • 6-6 重复显示字符(递归版)
    • 6-7 显示平行四边形(右)(递归版)

6-1 计算A[n]=1/(1 + A[n-1])

函数 fun 的功能是:根据整型形参 n,计算某一数据项的值。
A[1]=1, A[2]=1/(1 + A[1]), A[3]=1/(1 + A[2]), …,A[n]=1/(1 + A[n-1])
例如,若 n=10,则应输出:A10=0.617977。
函数接口定义:

float fun(int n);

其中n是用户传入的参数,函数须返回第n项的值。
裁判测试程序样例:

#include <stdio.h>

float fun(int n);

int main( )

{ int n ;

 scanf("%d", &n ) ;

 printf("A%d=%f\n", n, fun(n) ) ;

 return 0;

}



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

输入样例:

10

输出样例:

A10=0.6180

float fun(int n)
{
    if(n==1)
        return 1;
    else 
        return 1/(1+fun(n-1)); 
}

6-2 递归实现顺序输出整数

本题要求实现一个函数,对一个整数进行按位顺序输出。
函数接口定义:

void printdigits( int n );

函数printdigits应将n的每一位数字从高位到低位顺序打印出来,每位数字占一行。
裁判测试程序样例:

#include <stdio.h>


void printdigits( int n );


int main()

{

    int n;

    

    scanf("%d", &n);

    printdigits(n);


    return 0;

}


/* 你的代码将被嵌在这里 */

输入样例:

12345

输出样例:

1
2
3
4
5

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

6-3 自然数的位数(递归版)

请编写函数,求自然数的位数。
函数原型

int NumDigit(int number);

说明:参数 number 为非负整数。函数值为 number 的位数。若 number 为零,则函数值为零。
裁判程序

#include <stdio.h>


int NumDigit(int number);


int main()

{

    int n;

    scanf("%d", &n);

    printf("%d\n", NumDigit(n));

    return 0;

}


/* 你提交的代码将被嵌在这里 */

要求:不使用循环语句,用递归方法完成函数的设计。
输入样例

25173

输出样例

5

int NumDigit(int number)
{
    if(number==0)
        return 0;
    else if(number/10==0)
        return 1;
    else
    {
        return NumDigit(number/10)+1;
    }
}

6-4 分治法求解金块问题

分数 10
作者 张泳
单位 浙大城市学院

老板有一袋金块(共n块,2≤n≤100),两名最优秀的雇员每人可以得到其中的一块,排名第一的得到最重的金块,排名第二的则得到袋子中最轻的金块。

输入一个正整数N(2≤N≤100)和N个整数,用分治法求出最重金块和最轻金块。

本题要求实现2个函数,分别使用分治法在数组中找出最大值、最小值。
函数接口定义:

int max(int a[ ], int m, int n); 

int min(int a[ ], int m, int n);    

递归函数max用分治法求出a[m]~a[n]中的最大值并返回。

递归函数min用分治法求出a[m]~a[n]中的最小值并返回。
裁判测试程序样例:

#include <stdio.h>

#define MAXN 101


int max(int a[ ], int m, int n); 

int min(int a[ ], int m, int n);


int main(void)

{

    int i, n; 

    int a[MAXN]; 

    

    scanf ("%d", &n); 

    if(n >= 2 && n <= MAXN-1 ){

        for(i = 0; i < n; i++){ 

            scanf ("%d", &a[i]); 

        }

        printf("max = %d\n", max(a, 0, n-1));

        printf("min = %d\n", min(a, 0, n-1));

    }else{

        printf("Invalid Value.\n");    

    }


    return 0;

}



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

输入样例:

6
3 9 4 9 2 4

输出样例:

max = 9
min = 2

int max(int a[ ], int m, int n)
{
    int max=a[0];
    for(int i=m;i<=n;i++)
    {
        if(max<a[i])
            max=a[i];
    }
    return max;
}
int min(int a[ ], int m, int n)
{
    int min=a[0];
    for(int i=m;i<=n;i++)
    {
        if(min>a[i])
            min=a[i];
    }
    return min;
}

6-5 汉诺塔

分数 10
作者 黄龙军
单位 绍兴文理学院

汉诺(Hanoi)塔问题是一个经典的递归问题。

设有A、B、C三个塔座;开始时,在塔座A上有若干个圆盘,这些圆盘自下而上,由大到小地叠在一起。要求将塔座A上的圆盘移到塔座B上,并仍按同样顺序叠放。在移动过程中要求遵守如下规则:

每次只能移动一个圆盘;
任何时刻都不允许将较大的圆盘压在较小的圆盘之上;
在满足前两条规则的前提下,可将圆盘移至A、B、C中任何一塔座上。

例如,3个圆盘的初始状态如下:

hanoi.png

则移动过程如下:
A->B
A->C
B->C
A->B
C->A
C->B
A->B

要求实现一个递归函数,模拟输出n(1<=n<=8)个圆盘从塔座A借助塔座C移动到塔座B上的过程(用A->B表示将圆盘从A移到B,其他类似)。
函数接口定义:

void hanoi(int n, char from, char to, char by);

其中参数 n是圆盘数 、from是原来叠放圆盘的塔座 、to是最终叠放圆盘的塔座 、by是可借助的塔座。
裁判测试程序样例:

#include<iostream>

using namespace std;


//将n个圆盘借助by从from移到to

void hanoi(int n, char from, char to, char by);


//输入n,输出将原来在A上的n个圆盘借助C移动到B上的移动过程,控制到文件尾

int main() {

    int n, cnt=0;

    while(cin>>n) {

        cnt++;

        if (cnt>1) cout<<endl;

        hanoi(n, 'A', 'B', 'C');

    }

    return 0;

}

输入样例:

3
4

输出样例:

A->B
A->C
B->C
A->B
C->A
C->B
A->B

A->C
A->B
C->B
A->C
B->A
B->C
A->C
A->B
C->B
C->A
B->A
C->B
A->C
A->B
C->B

void hanoi(int n, char from, char to, char by)
{
    if(n==1)
    {
        printf("%c->%c\n",from,to);
        return;
    }
    else
    {
        hanoi(n-1,from,by,to);
        printf("%c->%c\n",from,to);
        hanoi(n-1,by,to,from);
    }
}

6-6 重复显示字符(递归版)

请编写递归函数,重复显示字符。
函数原型

void Show(int number, char symbol);

说明:参数 number 为重复次数,symbol 为显示字符。函数将在屏幕上重复显示 number 个 symbol 字符。若 number ≤ 0,则不输出。
裁判程序

#include <stdio.h>


void Show(int number, char symbol);


int main()

{

    int n;

    char s;

    scanf("%d %c", &n, &s);

    Show(n, s);

    putchar('\n');

    return 0;

}


/* 你提交的代码将被嵌在这里 */

输入样例1

-3 #

输出样例1

输入样例2

5 *

输出样例2


要求:不使用循环语句。

void Show(int number, char symbol)
{
    if(number<=0)
    return;
    else
    {
    printf("%c",symbol);
    Show(number-1,symbol);
    }
}

6-7 显示平行四边形(右)(递归版)

分数 10
作者 李祥
单位 湖北经济学院

请编写递归函数,显示平行四边形(向右)。
函数原型

void RtPara(int width, int height, char symbol);

说明:参数 width、height 分别为平行四边形的底和高,symbol 为显示字符。函数将在屏幕上显示底宽为 width、高度为 height 由字符 symbol 组成的平行四边形(向右)。若 width, height ≤ 0,则不输出。
裁判程序

#include <stdio.h>


void Show(int number, char symbol);

void RtPara(int width, int height, char symbol);


int main()

{

    int w, h;

    char s;

    scanf("%d %d %c", &w, &h, &s);

    RtPara(w, h, s);

    putchar('\n');

    return 0;

}


......


/* 你提交的代码将被嵌在这里 */

提示:需要利用前面作业中的 Show 函数,此外需要增加自用的内部函数。
输入样例1

-3 0 #

输出样例1

输入样例2

20 5 *

输出样例2

    ********************
   ********************
  ********************
 ********************
********************

要求:不使用循环语句,用递归方法完成函数的设计。

关联习题:重复显示字符(递归版)。

void PrintSpaces(int number)
{
    if(number<=0)
        return;
    else
    {
        printf(" ");
        PrintSpaces(number-1);
    }
}

void RtPara(int width,int height,char symbol)
{
    if(width<=0||height<=0)
        return;
    else
    {
        PrintSpaces(height-1); // 打印平行四边形上方的空格

        Show(width,symbol); // 打印平行四边形第一行

        putchar('\n'); // 换行

        RtPara(width,height-1,symbol); // 递归调用,打印剩余行数的平行四边形
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/182439.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

代码随想录算法训练营第五十二天|300.最长递增子序列 674. 最长连续递增序列 718. 最长重复子数组

文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;代码随想录B站账号 状态&#xff1a;看了视频题解和文章解析后做出来了 300.最长递增子序列 class Solution: # 2516 ms, faster than 64.96%def lengthOfLIS(self, nums: List[int]) -> int:n len(nums)dp [1] * n…

黑马点评-10实现用户点赞和点赞排行榜功能

用户点赞功能 如果用户只要点赞一次就对数据库中blog表中的liked字段的值加1就会导致一个用户无限点赞 PutMapping("/like/{id}") public Result likeBlog(PathVariable("id") Long id) {// 修改点赞数量,update tb_blog set liked liked 1 where id …

JavaScript编程基础 – 布尔值(Booleans)

JavaScript编程基础 – 布尔值(Booleans) Javascript Programming Essentials – Booleans 一个JavaScript布尔值包含两个值中的一个&#xff0c;即 true 或者 false。 本文简要介绍JavaScript布尔值的具体应用&#xff0c;以及可能作为对象的布尔值等。 1. 布尔值(Booleans)…

Py之PyPDF2:PyPDF2的简介、安装、使用方法之详细攻略

Py之PyPDF2&#xff1a;PyPDF2的简介、安装、使用方法之详细攻略 目录 PyPDF2的简介 PyPDF2的安装 PyPDF2的使用方法 1、基础用法 PyPDF2的简介 PyPDF2是一个免费的、开源的纯python PDF库&#xff0c;能够拆分、合并、裁剪和转换PDF文件的页面。它还可以为PDF文件添加自定…

springcloud超市管理系统源码

技术说明&#xff1a; jdk1.8&#xff0c;mysql5.7&#xff0c;idea&#xff0c;vscode springcloud springboot mybatis vue elementui mysql 功能介绍&#xff1a; 后台管理&#xff1a; 统计分析&#xff1a;查看用户&#xff0c;商品&#xff0c;销售数量&#xff1b;…

JavaWeb——感谢尚硅谷官方文档

JavaWeb——感谢尚硅谷官方文档 XML一、xml简介二、xml的语法1、文档申明2、xml注释3、xml元素4、xml属性5、xml语法规则 三、xml解析技术1、使用dom4j解析xml Tomcat一、JavaWeb的概念二、web资源的分类三、常见的web服务器四、Tomcat的使用1、安装2、Tomcat的目录介绍3 启动T…

数据结构-leetcode(设计循环队列)

1.学习内容&#xff1a; 今天 我们讲解一道能够很好的总结所学队列知识的题目---设计循环队列 622. 设计循环队列 - 力扣&#xff08;LeetCode&#xff09; 2.题目描述&#xff1a; 让我们设计一个队列 要求是循环的 这和我们的双向链表有些类似 让我们按要求设计出这些相对…

视频云存储EasyCVR平台国标接入获取通道设备未回复是什么原因?该如何解决?

安防视频监控/视频集中存储/云存储/磁盘阵列EasyCVR平台可拓展性强、视频能力灵活、部署轻快&#xff0c;可支持的主流标准协议有国标GB28181、RTSP/Onvif、RTMP等&#xff0c;以及支持厂家私有协议与SDK接入&#xff0c;包括海康Ehome、海大宇等设备的SDK等。平台既具备传统安…

Python中的解析器argparse

import argparse## 构造解析器 argparse.ArgumentParser() parse argparse.ArgumentParser(description"caculateing the area of rectangle")## 添加参数 .add_argument() parse.add_argument("--length",typeint,default20,helpThe length of rectangle…

西米支付:如何设计和构建游戏支付系统?

如何设计和构建游戏支付系统&#xff1f; 目前&#xff0c;游戏开发中最常见的支付方式包括微信支付、支付宝支付和苹果支付等。今天&#xff0c;我将与大家分享游戏支付系统的架构和设计。 游戏支付的主要业务流程是指游戏玩家在游戏中购买虚拟物品或服务所进行的支付过程。一…

深入了解Java8新特性-日期时间API_LocalDate类

阅读建议 嗨&#xff0c;伙计&#xff01;刷到这篇文章咱们就是有缘人&#xff0c;在阅读这篇文章前我有一些建议&#xff1a; 本篇文章大概12000多字&#xff0c;预计阅读时间长需要10分钟。本篇文章的实战性、理论性较强&#xff0c;是一篇质量分数较高的技术干货文章&…

使用 PowerShell 中的命令来删除共享目录

Remove-SmbShare -Name "ShareName" 请将 "ShareName" 替换为您要删除的实际共享目录的名称。 请注意&#xff0c;执行此命令需要具有适当的权限。确保您以管理员身份运行 PowerShell 或具有足够的权限来删除共享目录。

超详细的自动化测试教程

什么是自动化测试&#xff1f; 做测试好几年了&#xff0c;真正学习和实践自动化测试一年&#xff0c;自我感觉这一个年中收获许多。一直想动笔写一篇文章分享自动化测试实践中的一些经验。终于决定花点时间来做这件事儿。 首先理清自动化测试的概念&#xff0c;广义上来讲&a…

微信小程序汽车租赁系统

微信小程序汽车租赁系统 本系统包含了3类用户&#xff0c;分别为客户、员工以及管理员&#xff0c;客户主要是满足自身的租车需求&#xff0c;员工主要负责车辆的调度问题和维修状况&#xff0c;管理员则是主要对人员、车辆和订单的管理。以下是对各自功能的详细介绍: 客户可…

简单聊聊加密和加签的关系与区别

大家好&#xff0c;我是G探险者。 平时我们在项目上一定都听过加密和加签&#xff0c;加密可能都好理解&#xff0c;知道它是保障的数据的机密性&#xff0c;那加签是为了保障啥勒&#xff1f;它和加密有啥区别&#xff1f; 带着这个疑问&#xff0c;我们就来聊聊二者的区别。…

测试15k薪资第1步 —— 自动化测试理论基础

目录 1、自动化测试定义 2、自动化测试分类&工具 3、未来发展趋势 1.1、什么是自动化测试 自动化测试指的是利用软件工具或脚本来执行测试任务&#xff0c;以替代手动测试过程的一种测试方法。它的主要目的是通过自动化执行、验证和评估软件应用的功能、稳定性、性能等方面…

Redis(哨兵模式)

哨兵模式的定义&#xff1a; 是Redis的一种高可用解决方案&#xff0c;通过运行多个Redis实例来监控主从Redis实例的状态&#xff0c;当主实例出现故障时&#xff0c;哨兵会自动选举一个从实例作为新的主实例&#xff0c;从而保证系统的高可用性。哨兵模式可以监控多个主从Red…

HCIP---MPLS---LDP

文章目录 前言一、pandas是什么&#xff1f;二、使用步骤 1.引入库2.读入数据总结 前言 MPLS 基于标签转发表进行转发&#xff0c;与路由表类似&#xff0c;标签转发表有两种获取渠道&#xff1a;一是手动配置(类似静态路由)&#xff0c;二是通过协议自动学习(类似OSPF)。手动配…

ubuntu搭建phpmyadmin+wordpress

Ubuntu搭建phpmyadmin wordpress Linux系统设置&#xff1a;Ubuntu 22配置apache2搭建phpmyadmin配置Nginx环境&#xff0c;搭建wordpress Linux系统设置&#xff1a;Ubuntu 22 配置apache2 安装apache2 sudo apt -y install apache2设置端口号为8080 sudo vim /etc/apache…

【MISRA-C 2012】浓缩版解读

文章目录 1、前言2、简介2.1、如何看待MISRA-C 20122.2、准则(guidelines)里面的指示(Directive)和规则(Rule)2.3、准则(guidelines)的级别(Category) 3、若干重要的Directive和Rule3.1、指示(Directive)Dir 2.1&#xff08;必要&#xff09; 所有的源文件编译过程不得有编译错…
最新文章