c语言简单编程练习8

1、递归函数:

通过调用自身来解决问题的函数,递归也就是传递和回归;

递归函数的两个条件:

1)函数调用函数本身

2)一定要有结束条件

循环与递归的区别:

每调用一次递归函数,都会开辟新的空间地址,所以超过计算机调用的空间地址就会报错,循环只需要开辟局部变量的空间地址,不会出现段错误

结论:循环能做的递归一定能做,递归能做的循环不一定可以做,但是一般能用循环解决的问题就用循环去做

2、用递归函数求一个数的阶乘

#include <stdio.h>
int sum(int n)
{if(0==n)return 1;elsereturn n*sum(n-1); //调用自己,每次都乘以形参-1,一直到1,为0返回1
}
int main(int argc, char *argv[])
{int i, n;printf("请输入一个整数:");scanf("%d",&n);i = sum(n);printf("%d的阶乘为:%d\n",n,i);
}

解析:首先求一个数的阶乘我们需要使用循环,如果是用for循环那么我们一般会让一个变量从1开始自增到目标数字,每次循环都让i去乘以前面的值,这样最后就能得到一个数的阶乘;但是在递归函数里面我们需要一个结束条件,所以在每次调用递归函数我都让传入的参数减去一,这样当传入的数字变为0的时候就结束了循环,下图是递归的一个执行过程:

 

通过这样一个过程我们就能得到5的阶乘了,递归就是一步一步传递下去最后再回归的一个思想,代码运行结果如下:

3、用递归函数统计一个十进制数转为二进制数后二进制中1的个数

#include <stdio.h>
int sum(unsigned int n)
{int i=0;if(n){if(n%2==1)i++;return i+sum(n/=2);}
}
int main(int argc, char *argv[])
{unsigned int n;printf("请输入一个整数:");scanf("%d",&n);printf("%d转为二进制后二进制中1的个数为%d\n",n,sum(n));return 0;
} 

解析:题目要求是统计转为二进制后其中1的个数,那么我们只需将输入的整数除以2,判断它的余数为不为1,如果为1就计数+1,之后再取除以2之后的商,让这个商再除以2,依次循环,直到商为0为止,最后输出计数的值即可。在递归中如何实现呢,首先我们在调用自己的时候,传进去的参数一定是上一次传入参数除以2之后的商,除此之外,每一次的递归都要加上计数的值,这样我们就得到了返回值的表达式为 i+sum(n/=2);这里的i为计数值。当商为0再传入函数的时候就不会计数和判断了,到这里递归就结束了。

 

4、回调函数

让一个函数和另一个函数具有关联性,允许用户把需要调用的函数的指针作为参数传递给一个函数,以便于该函数在处理相似事件的时候可以灵活的使用不同的方法。这个方法是通过函数指针实现的,在一个函数传参的地方使用一个函数指针来接收另一个函数名,被作为参数传递给另一个函数的函数称为回调函数。

一般用法:在一个函数中,把另一个函数作为参数传递给当前函数,当前函数的形参用函数指针来接收。   例如:

#include <stdio.h>
void x()
{puts("111");
}
void y(void (*p)())
{p();puts("222");
}
int main(int argc, char *argv[])
{y(x);return 0;
}

解析:代码中的函数x就是一个回调函数,它被作为一个参数传递给了函数y,当我在主函数中调用函数y并且函数y中的参数为x的时候,得到的输出结果就是111,222,如下图所示:

5、malloc函数

动态开辟空间地址,用户在堆区开辟空间地址,最后也要由用户自己释放

例:用malloc函数开辟10个int型大小的空间地址,然后给这10个int地址随机赋值10个数,最后从小到大排序 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char *argv[])
{srand(time(NULL));int temp,i,j;int *p=(int *)malloc(sizeof(int)*10); //用指针来接收开辟空间的首地址if(NULL==p){printf("malloc creat failed\n");return -1;}printf("排序前:");for(i=0;i<10;i++)   //赋值{p[i]=rand()%100;printf("%d ",p[i]);}puts("");for(i=0;i<9;i++)  //冒泡排序{for(j=0;j<9-i;j++){if(p[j]>p[j+1]){temp=p[j];p[j]=p[j+1];p[j+1]=temp;}}}printf("排序后:");for(i=0;i<10;i++){printf("%d ",p[i]);}puts("");free(p); //释放空间p=NULL;  //释放指针return 0;
} 

解析:这里主要是让宝子们了解malloc函数怎么使用,首先我们需要用一个指针来接收我们开辟的这片空间的首地址;我们开辟的是整型空间地址,因此前面是(int *),我们开辟的是十个整型空间地址,所以是sizeof(int)*10;这一步之后我们就开辟了这个空间地址,当然只是开辟是这样做,到最后有没有开辟成功我们还需要通过判断才能知道;通过判断这个指针p是否为空来判断我们开辟空间是否成功,如果开辟失败则打印提示;在我们使用完这片空间地址之后还需要将它手动释放,也就是free(p);在这里释放的是这片空间,但是指针p还存在,因此我们还需要让这个指针指向NULL,避免它成为一个野指针。

 

 

 

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

如何将MySQL彻底卸载干净

目录 背景&#xff1a; MySQL的卸载 步骤1&#xff1a;停止MySQL服务 步骤2&#xff1a;软件的卸载 步骤3&#xff1a;残余文件的清理 步骤4&#xff1a;清理注册表 步骤五:删除环境变量配置 总结&#xff1a; 背景&#xff1a; MySQL卸载不彻底往往会导致重新安装失败…

linux-环境变量

环境变量是系统提供的一组 name value 的变量&#xff0c;不同的变量有不同的用途&#xff0c;通常都具有全局属性 env 查看环境变量 PATH PATH是一个保存着系统指令路径的一个环境变量&#xff0c;系统提供的指令不需要路径&#xff0c;直接就可以使用就是因为指令的路径…

IDEA修改生成jar包名字的两种方法实现

IDEA修改生成jar包名字的两种方法实现 更新时间&#xff1a;2023年08月18日 11:45:36 作者&#xff1a;白白白鲤鱼 本文主要介绍了IDEA修改生成jar包名字的两种方法实现,通过简单的步骤,您可以修改项目名称并在打包时使用新的名称,具有一定的参考价值,感兴趣的可以了解下 …

【Java Web】JSP实现数据传递和保存(中)中文乱码 转发与重定向

文章目录 中文乱码转发与重定向转发重定向区别 升级示例1 中文乱码 JSP 中默认使用的字符编码方式&#xff1a;iso-8859-1&#xff0c;不支持中文。常见的支持中文的编码方式及其收录的字符&#xff1a; gb2312&#xff1a;常用简体汉字gbk&#xff1a;简体和繁体汉字utf-8&a…

ROS话题通信机制理论模型的学习

话题通信是ROS&#xff08;Robot Operating System&#xff0c;机器人操作系统&#xff09;中使用频率最高的一种通信模式&#xff0c;其实现模型主要基于发布/订阅模式。 一、基本概念 话题通信模型中涉及三个主要角色&#xff1a; ROS Master&#xff08;管理者&#xff0…

【Ai教程】Ollma安装 | 0代码本地运行Qwen大模型,保姆级教程来了!

我们平时使用的ChatGPT、kimi、豆包等Ai对话工具&#xff0c;其服务器都是部署在各家公司的机房里&#xff0c;如果我们有一些隐私数据发到对话中&#xff0c;很难保证信息是否安全等问题&#xff0c;如何在保证数据安全的情况下&#xff0c;又可以使用大预言模型&#xff0c;O…

从工作原理上解释为什么MPLS比传统IP方式高效?

多协议标签交换&#xff08;Multiprotocol Label Switching, MPLS&#xff09;是一种用于高速数据包转发的技术。它通过在网络的入口点对数据包进行标签操作&#xff0c;然后在核心网络内部基于这些标签来快速转发数据包&#xff0c;从而提高了数据传输效率。以下是几个方面解释…

以命令行形式执行Postman脚本(使用Newman)

一、背景 ​ Postman的操作离不开客户端。但是在一些情况下可能无法使用客户端去进行脚本执行。比如在服务端进行接口测试。由此我们引入了Newman。Newman基于Node.js开发&#xff0c;它使您可以直接从命令行轻松运行和测试Postman测试集。它在构建时考虑了可扩展性&#xff0c…

国内手机号Google账号(gmail)注册教程

注意&#xff01;&#xff01;本篇只适用于未注册过或未修改过的萌新用户&#xff01;&#xff01;&#xff01;&#xff01;&#xff08;我注册第二个账号时就通过不了了&#xff09; 国内手机号码如何创建Google&#xff08;谷歌&#xff09;账号&#xff0c;我们会发现&…

性能测试|docker容器下搭建JMeter+Grafana+Influxdb监控可视化平台

前言 在当前激烈的市场竞争中&#xff0c;创新和效率成为企业发展的核心要素之一。在这种背景下&#xff0c;如何保证产品和服务的稳定性、可靠性以及高效性就显得尤为重要。 而在软件开发过程中&#xff0c;性能测试是一项不可或缺的环节&#xff0c;它可以有效的评估一个系…

大语言模型训练的全过程:预训练、微调、RLHF

一、 大语言模型的训练过程 预训练阶段&#xff1a;PT&#xff08;Pre training&#xff09;。使用公开数据经过预训练得到预训练模型&#xff0c;预训练模型具备语言的初步理解&#xff1b;训练周期比较长&#xff1b;微调阶段1&#xff1a;SFT&#xff08;指令微调/有监督微调…

【LeetCode】【算法】142. 环形链表II

142环形链表II 题目描述 给定一个链表的头节点 head &#xff0c;返回链表开始入环的第一个节点。 如果链表无环&#xff0c;则返回 null。 如果链表中有某个节点&#xff0c;可以通过连续跟踪 next 指针再次到达&#xff0c;则链表中存在环。 为了表示给定链表中的环&#x…

白话文讲解大模型| Attention is all you need

本文档旨在详细阐述当前主流的大模型技术架构如Transformer架构。我们将从技术概述、架构介绍到具体模型实现等多个角度进行讲解。通过本文档&#xff0c;我们期望为读者提供一个全面的理解&#xff0c;帮助大家掌握大模型的工作原理&#xff0c;增强与客户沟通的技术基础。本文…

解析IO零拷贝技术

背景介绍 从字面上我们很容易理解出&#xff0c;零拷贝包含两个意思&#xff1a; 拷贝&#xff1a;就是指数据从一个存储区域转移到另一个存储区域。零&#xff1a;它表示拷贝数据的次数为 0。 合起来理解&#xff0c;零拷贝就是不需要将数据从一个存储区域复制到另一个存储…

练习LabVIEW第三十六题

学习目标&#xff1a; 刚学了LabVIEW&#xff0c;在网上找了些题&#xff0c;练习一下LabVIEW&#xff0c;有不对不好不足的地方欢迎指正&#xff01; 第三十六题&#xff1a; 使用labview模拟温度采集系统&#xff0c;要求有停止键 开始编写&#xff1a; 前面板放一个温度…

day-81 打家劫舍 II

思路 与LCR 089. 打家劫舍相比&#xff0c;本题所有房屋围成了一圈&#xff0c;那么第一间房子和最后一间房子不能同时打劫&#xff0c;那么就可以分为两种情况&#xff1a;1.选第一间房打劫&#xff1b;2.选最后一间房打劫 解题过程 然后依次计算出以上两种情况的最大金额&am…

linux网络编程自定义协议和多进程多线程并发-TCP编程

1.三次握手及后面过程 计算机A是客户端, B是服务端 1.1三次握手&#xff1a; 1客户端给服务端SYN报文 2服务端返回SYNACK报文 3客户端返回ACK报文 客户端发完ACK后加入到服务端的维护队列中&#xff0c;accept()调用后就能和客户端建立连接&#xff0c;然后建立通讯 1.2关闭…

【工具】批量网址打开器,一次打开多个网址链接

假如你有很多个网址&#xff0c;这些网址要全部打开&#xff0c;你是否会每次复制一个粘贴到浏览器地址栏&#xff0c;再去复制下一个粘贴到地址栏&#xff0c;这样重复的操作&#xff1f;我就有这样的困扰&#xff0c;比如要检查网页上是否有bug&#xff0c;就要一个一个的点开…

「Mac畅玩鸿蒙与硬件24」UI互动应用篇1 - 灯光控制小项目

本篇将带领你实现一个互动性十足的灯光控制小项目&#xff0c;用户可以通过点击按钮来控制灯光的开关。该项目将涉及状态管理、动态图片加载以及按钮交互&#xff0c;是学习鸿蒙应用开发的重要基础。 关键词 UI互动应用状态管理动态图片加载用户交互 一、功能说明 在这个灯光…

如何从0到1开发一款智能生产小工单系统——全网最详细教程!

在生产车间&#xff0c;工单管理一度是个让人头疼的问题。任务分配不清、生产流程混乱、交接环节不顺畅等问题&#xff0c;让管理人员和一线工人疲于奔命。而一个智能的生产小工单系统正是解决这些问题的利器。不仅能有效地理顺工单流转流程&#xff0c;还能大幅提升工作效率和…