C语言例题(递归、二分查找、冒泡排序)

server/2024/9/25 23:25:27/

一、递归案例

有5个人坐在在一起,问第5个人多少岁?他说比第4个人大两岁。问第4个人岁数,他说比第3个人大两岁。问第3个人,又说比第2个人大两岁。问第2个人,说比第1个人大2岁。最后问第1个人,他说是10岁。请问第5个人多大?

请使用递归完成以上问题的求解。

#include <stdio.h>
int getAge(int n){//如果n等于1,函数返回10。这表示第一个人(或者当n为1时)的年龄是10岁。if(n==1){return 10;}else{//(n-1)+2意思是,要想知道当前考虑的人n的年龄,就要先找到他前一个人(n-1)的年龄的基础上加2岁return getAge(n-1)+2;                 }
}
int main() {
// 基础条件:第一个人是10岁
// 递归条件:(n-1)+2
int res=getAge(5);
printf("%d",res);return 0;
}

二、二分查找案例

给定数组{1,3,6,12,45,67,89,93,96},使用二分查找求93的下标并输出。

#include <stdio.h>
int binSearch(int arr[],int len,int target){//左边界int left=0;//len-1,数组长度-1就是数组的最后一项,是右边界int right=len-1;//左边必须小于或者等于右边,条件才成立,不然就是超出边界while(left<=right){//计算中间位置 mid 来决定下一步搜索哪一半数组。简单的方法可能是直接使用 (left + right) / 2 来计算 mid,//但这种方法在 left 和 right 都很大时可能导致整数溢出。//为了避免这种情况,我们使用 left + (right - left) / 2 的公式。//这个公式首先计算 right 和 left 之间的差值,然后除以 2,最后再加上 left。//这样,即使 left 和 right 很大,它们的差值也不会太大,从而避免了整数溢出的问题。int mid=left+(right-left)/2;// if判断中间值,如果等于目标值,直接返回(return mid)目标值就okif(arr[mid]==target){return mid;// else if判断中间值是否小于目标值// 如果 arr[mid] 确实小于 target,说明目标值 target 必然在 mid 的右侧(即数组的后半部分)// 因为数组是有序的。因此,我们将搜索范围缩小到 mid 的右侧,即更新 left = mid + 1。}else if(arr[mid]<target){left=mid+1;// 如果 arr[mid] > target,则目标值 target 必然在 mid 的左侧(即数组的前半部分),// 因为数组是有序的。因此,我们将搜索范围缩小到 mid 的左侧,即更新 right = mid - 1。}else{right=mid-1;}}return -1;
}
int main() {int arr[]={1,3,6,12,45,67,89,93,96};int len=sizeof(arr)/sizeof(arr[0]);int target=12;int index=return 0;
}

三、冒泡排序

给定数组{3,93,67,96,45,6,89,93,12},对数组进行排序并输出。

#include <stdio.h>int main() {int arr[]={1,34,56,78,54,32,12,2,7};int len=sizeof(arr)/sizeof(arr[0]);
//外层循环控制排序的次数(五个数字排序就是对比四次,所以要len-1)for(int i=0;i<len-1;i++){
//内层循环控制循环趟数(每次循环一次就排除一个数字和下标,所以是len-i-1)for(int j=0;j<len-i-1;j++){if(arr[j]>arr[j+1]){int temp=arr[j];arr[j]=arr[j+1];arr[j+1]=temp;}}};
for(int i=0;i<len-1;i++){printf("%d\n",arr[i]);
}return 0;
}

http://www.ppmy.cn/server/23753.html

相关文章

二叉树06(leetcode654,617,700,98)

参考资料&#xff1a; https://programmercarl.com/0654.%E6%9C%80%E5%A4%A7%E4%BA%8C%E5%8F%89%E6%A0%91.html 654. 最大二叉树 题目描述&#xff1a; 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为…

学习C语言的指针

有一阵没更新了&#xff0c;因为最近比较繁忙&#xff0c;所以更新比较慢&#xff0c;还在慢慢学习 话不多说&#xff0c;开始今天的内容&#xff0c;聊一聊C语言指针。 很多小伙伴可能会被指针这个名字吓到&#xff0c;觉得很难&#xff0c;实际上确实有点难&#xff0c;但是…

tcp inflight 守恒算法背后的哲学

tcp inflight 守恒拥塞控制的正确性 很久以前我开始纠结 tcp 锯齿&#xff0c;很多年后我知道这叫 capacity-seeking&#xff0c;甚至说 tcp 属于 capacity-seeking protocol 的原因就是它早已深入人心的 aimd 行为&#xff0c;而该行为生成了 tcp 锯齿。 在消除锯齿&#xf…

乐观锁和悲观锁

概述 悲观锁 坏事一定会发生&#xff0c;所以先做预防&#xff08;上锁&#xff09; 写多读少 乐观锁&#xff1a;坏事不一定会发生&#xff0c;所以事后补偿 写少读多 悲观锁 select for update&#xff0c;sychronized等&#xff0c;乐观锁&#xff0c;乐观锁如cas和版本号 …

Redis基本數據結構 ― List

Redis基本數據結構 ― List 介紹常用命令範例1. 將元素推入List中2. 取得List內容3. 彈出元素 介紹 Redis中的List結構是一個雙向鏈表。 LPUSH LPOP StackLPUSH RPOP QueueLPUSH BRPOP Queue(消息隊列) 常用命令 命令功能LPUSH將元素推入列表左端RPUSH將元素推入列表右…

LeetCode——滑动窗口

滑动窗口 包含特定元素的子串&#xff08;要匹配到的目标&#xff09;&#xff0c;或最长[这个好像没啥意思]、或最短、或等长 思考&#xff1a;&#xff08;暂时感受&#xff09; 1&#xff09;什么时候扩充窗口——串没走完就得扩呀&#xff1b; 2&#xff09;窗口扩充后…

typora中如何使用cos存储

上传工具 https://toolinbox.net/iPic/ 腾讯云的cos存储 https://console.cloud.tencent.com/cos/bucket?actioncreate cos防盗指引 对象存储 防盗刷指引-最佳实践-文档中心-腾讯云 cos计费规则 对象存储 流量费用-购买指南-文档中心-腾讯云 其他方法可以参考 Typora等mar…

Jenkins 哲学 - 插件初始化安装失败

到Jenkins官网查找最新的LST版本 最后的版本号一定要带&#xff0c;指定下载具体的版本号 docker pull jenkins/jenkins:2.426.1 自定义挂载目录&#xff0c;修改权限 mkdir /jenkins/jenkins_homechmod 777 /data/jenkins