当前位置: 首页 > news >正文

函数02 day11

五:嵌套调用(递归)

1.直接递归

void func1
{printf("func1-----\n");func1();
}

2.间接递归

void func1()
{printf("func1-----\n");void func2();func2();
}
void func2()
{printf("func2-----\n");
}

3.递归是一种特殊的循环 //递归因为栈空间有限,即使没有结束条件,也不会死循环

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

int sum(int n)
{if(n == 1){return 1;}else{return sum(n-1) + n;//递归思路:从后往前看,看向上一次操作,累次}
}int main(int argc, const char *argv[])
{int n = 0;scanf("%d",&n);int ret = sum(n);printf("%d\n",ret);
int fb(int n)//斐波那契数列	第N项的值	
{if(n == 1||n == 2){return 1;}else{return fb(n-2) + fb(n-1);}
}
#include<stdio.h>//斐波那契数列	前N项的值int fb(int n)
{if(n == 1||n == 2){return 1;}else{return fb(n-2) + fb(n-1);}
}int sum(int n)
{if(n == 1){return 1;}else{return fb(n) + sum(n-1);}
}int main(int argc, const char *argv[])
{int n;scanf("%d",&n);printf("sum = %d\n",sum(n));return 0;
}

4.汉罗塔

#include <stdio.h>void move(int n ,int pole1,int pole2)
{static int step = 1;printf("%03d:[disk %d] : %c --> %c\n",step++,n,pole1,pole2);
}//起始柱  辅助柱    目标柱
void hanoi(int n, int   A, int   B,  int    C)
{if (1==n){move(n,A,C);}else {hanoi(n-1,A,C,B);//n-1 先挪走puts("-------");move(n,A,C); // 将第n个 挪到 目标柱 puts("-------");hanoi(n-1,B,A,C);}
}//n = 3;
//hanoi(2,'A','C','B')
//     | --------------------> hanoi(1,'A','B','C')
//                             move(2,'A','B');          [2:A->B]
//                                |----------------------->move(1,'A','C') [1:A->C]
//move(3,'A','C');   -----> [3:A->C]
//hanoi(2,'B','A','C');int main(void)
{int n = 0;printf("Input numbers of disk: ");scanf("%d",&n);hanoi(n,'A','B','C');return 0;
}

六:数组作为函数参数

1.数组元素作为函数参数:因为数组元素本身就是一个 变量,所以函数的形参,设计为对应类型的一个变量即可实参,传递对应的数组元素即可

void printArray(int b)
{
}
int a[10] = {1,2,3,4,5};
printArray(a[3]);

2.数组本身作为函数参数:数组传递,传的不是整个数组,而是首个数组元素的位置

​ 注意:一维整型数组做函数参数

​ 形参 数组形式 数组长度

​ 实参 数组名 数组长度

void printArray(int a[],int len)//int a[]//不用写范围//本质是指针
{int i;for(i=0;i<len;i++){printf("%d\n",a[i]);}
}
int main(int argc, const char *argv[])
{int a[10] = {1,2,3,4,5};int len = sizeof(a)/sizeof(a[0]);printArray(a,len);return 0;
}
#include<stdio.h>int findMax(int a[],int len)
{int i;int max = a[0];for(i=1;i<len;i++){if(a[i] > max){max = a[i];}}return max;
}
int main(int argc, const char *argv[])
{int a[10] = {1,2,3,4,5};int len = sizeof(a)/sizeof(a[0]);printf("max = %d\n",findMax(a,len));return 0;
}
#include<stdio.h>//逆序void antiArraay(int a[],int len)
{int i;int t;for(i=0;i<len/2;i++){t = a[len-i-1];a[len-i-1] = a[i];a[i] = t;}
}void printArray(int a[],int len)
{int i;for(i=0;i<len;i++){printf("%d ",a[i]);}putchar('\n');
}int main(int argc, const char *argv[])
{int a[10] = {1,2,3,4,5,6,7,8,9,10};int len = sizeof(a)/sizeof(a[0]);printArray(a,len);antiArraay(a,len);printArray(a,len);return 0;
void choseArraay(int a[],int len)//选择排序
{int t;for(int i=0;i<len-1;i++){for(int j=i+1;j<len;j++){if(a[i] > a[j]){t = a[j];a[j] = a[i];a[i] = t;}}}
}
void boBoArraay(int a[],int len)//冒泡
{int t;for(int i=1;i<len;i++){for(int j=0;j<len-i;j++){if(a[j] > a[j+1]){t = a[j+1];a[j+1] = a[j];a[j] = t;}}}
}
void insertArraay(int a[],int len)//插入
{int t;int j;for(int i=0;i<len;i++){t = a[i];j = i;while(j>0 && a[j-1]>t){a[j] = a[j-1];j--;}a[j] = t;}
}
int briFind(int a[],int len,int n)//二分查找
{int begin = 0;int end = len-1;int mid = 0;int ret = -1;while(begin <= end){int mid = (begin + end)/2;if(a[mid] > n){end = mid - 1;}else if(a[mid] < n){begin = mid + 1;}else{ret = mid;break;}}return ret;}
int n;
scanf("%d",&n);
((briFind(a,len,n) >= 0))?printf("found\n"):printf("not found\n");

七:字符型数组

1.字符型一维数组做函数参数

​ 形参 数组形式

​ 实参 数组名

​ 原因:因为字符型数组中主要存放字符串数据而字符串数据,本身有结束标志

void Puts(char str[])
{int i = 0;while(str[i] != '\0'){putchar(str[i]);i++;}putchar('\n');
}int main(int argc, const char *argv[])
{char s[20] = "hello";Puts(s);return 0;
}

2.strlen

int Strlen(char str[])
{int i = 0;while(str[i] != '\0'){i++;}return i;
}

3.strcpy

void Strcpy(char dest[],char src[])
{int i = 0;
#if 0while(src[i] != '\0'){dest[i] = src[i];i++;}dest[i] = '\0';
#endifwhile(dest[i] = src[i])//src到最后'\0'给到dest空位,正好也作为while的条件判断{++i;}
}

4.strcmp

int Strcmp(char s1[],char s2[])//strcmp
{int i = 0;while(s1[i] != '\0' && s2[i] != '\0'){if (s1[i] != s2[i]){break;}i++;}return s1[i] - s2[i];
}

八:数组型二维数组相关函数

1.整型二维数组作为函数参数

​ 形参 二维数组形式 行数的形参

​ 实参 二维数组数组名 二维数组行数

void printArray(int a[][4],int row)

2.打印二维数组

#include<stdio.h>void printArray(int a[][4],int row)
{int i = 0;int j = 0;for(i=0;i<row;++i){for(j=0;j<4;++j){printf("%3d ",a[i][j]);}putchar('\n');}
}int main(int argc, const char *argv[])
{int a[][4] = {1,2,3,4,5,6,7,8,9,10,11,12};int row = sizeof(a)/sizeof(a[0]);printArray(a,row);return 0;
}

3.scanf

void scanfArray(int a[][4],int row)
{for(int i=0;i<row;i++){for(int j =0;j<4;j++){int n;scanf("%d",&n);a[i][j] = n;}}
}

4.max

int findMax(int a[][4],int row)
{int max = a[0][0];for(int i=0;i<row;i++){for(int j =0;j<4;j++){if(max < a[i][j]){max = a[i][j];}}}return max;
}

九:字符型二维数组

1.字符型二维数组做函数参数

​ 形参 二维数组的形式 行数的形参

​ 实参 二维数组数组名 行数

数组类型不能作为函数返回值

void printfStr(char s[3][10],int row)
{for(int i=0;i<row;i++){puts(s[i]);}
}

2.scanf

void scanfStr(char s[][10],int row)
{for(int i=0;i<row;i++){scanf("%s",s[i]);}
}

3.找最大字符串

void maxString(char s[][10],int row,char max[10])//可以在形参中设置max返回
{strcpy(max,s[0]);for(int i=1;i<row;i++){if(strcmp(s[i],max) > 0){strcpy(max,s[i]);}}
}maxString(s,row,max);//只能通过这样返回,不能直接printf一步到位printf("max_char = %s\n",max);
int maxString(char s[][10],int row)//标准
{char max[10];strcpy(max,s[0]);int ret = 0;for(int i=1;i<row;i++){if(strcmp(s[i],max) > 0){strcpy(max,s[i]);ret = i;}}return ret;
}printf("max_char = %s\n",s[maxString(s,row)]);

十:字符串排序

#include<stdio.h>
#include<string.h>int Strcmp(char s1[],char s2[])//strcmp
{int i = 0;while(s1[i] != '\0' && s2[i] != '\0'){if (s1[i] != s2[i]){break;}i++;}return s1[i] - s2[i];
}
void chosenArr(char s[][10],int row)
{for(int i=0;i<row-1;i++){for(int j=i+1;j<row;j++){if(Strcmp(s[i],s[j]) > 0){char t[10];strcpy(t,s[j]);strcpy(s[j],s[i]);strcpy(s[i],t);}}}
}void boArr(char s[][10],int row)
{for(int i=1;i<row;i++){for(int j=0;j<row-1;j++){if(Strcmp(s[j],s[j+1]) > 0){char t[10];strcpy(t,s[j+1]);strcpy(s[j+1],s[j]);strcpy(s[j],t);}}}
}void insertArr(char s[][10],int row)
{char t[10];for(int i=0;i<row;i++){strcpy(t,s[i]);int j = i;while(j>0 && s[j-1] > t){strcpy(s[j],s[j-1]);j--;}strcpy(s[j],t);}
}void printfStr(char s[][10],int row)
{for(int i=0;i<row;i++){puts(s[i]);}
}int main(int argc, const char *argv[])
{char s[][10] = {"hello","world","china"};int row = sizeof(s)/sizeof(s[0]);printfStr(s,row);//chosenArr(s,row);//boArr(s,row);insertArr(s,row);printf("----------------------\n");printfStr(s,row);return 0;
}

相关文章:

  • 模型参数、模型存储精度、参数与显存
  • python46
  • Code Composer Studio快捷键
  • 101.为AI知识问答寻找朗读合适API
  • 5G+边缘计算推动下的商品详情API低延迟高效率新方案
  • 第十一章 通用定时器(上篇)
  • 工业安全零事故的智能守护者:一体化AI智能安防平台
  • DSP——时钟树讲解
  • qt3d自定义生成mesh图形
  • AISHELL-5 全球首套智能驾舱中文语音交互数据集开源
  • 看板会议如何高效进行
  • 编程的本质难点:超越技术层面的五大核心障碍-优雅草卓伊凡
  • 一个n8n构建的能和LLM对话的Agent
  • Cesium1.95中高性能加载1500个点
  • Llama 4开源项目多维分析研究
  • 深入浅出Asp.Net Core MVC应用开发系列-AspNetCore中的日志记录
  • 供应链管理-物流:自动驾驶分为几个级别/L0无自动化/L1驾驶辅助/L2部分自动化/L3有条件自动化/L4高度自动化/L5完全自动化
  • Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
  • XML Group端口详解
  • CANopen转Modbus TCP转换器助生产线智能化升级
  • 营销型网站建设大千建站/北京百度seo排名公司
  • 抢车票网站怎么做/信息发布平台推广有哪些
  • 网站免费源码大全/安卓系统最好优化软件
  • 贝壳企业网站管理系统/公司广告推广
  • php网站模块/百度网站流量查询
  • 东阳网站建设/郑州做网站推广电话