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

函数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;
}
http://www.xdnf.cn/news/13381.html

相关文章:

  • AI赋能农业
  • 第十六章 I2C
  • 【PhysUnits】17.6 Unit基础结构(unit.rs)
  • <component :is=““>
  • CentOS7下的ZooKeeper部署
  • 55. Jump Game
  • Redis持久化策略介绍,以及如何选择?
  • 第二十四章 通用同步异步收发器(USART)
  • java异步编程难题拆解
  • Java 中 switch-case 语句的执行逻辑与避坑指南
  • Java判断规则工具类
  • 工作日记总结-transaction is aborted, commands ignored until end of transaction block
  • [软件测试]:什么是自动化测试?selenium+webdriver-manager的安装,实现你的第一个脚本
  • Kotlin基础语法二
  • 大数据学习(136)-数据埋点
  • 玄机 日志分析-Tomcat日志分析 WriteUp
  • G-Star公益行 | 公益组织入门开源技术,六月北京点燃改变的星火
  • 【MySQL数据库】InnoDB存储引擎:事务原理redolog、undolog与版本控制MVCC
  • QuecPython 文件系统操作
  • 多光谱图像技术在苗期作物与杂草识别中的研究进展
  • C语言学习20250610
  • Dynadot邮箱工具指南(六):将域名邮箱添加至网易邮箱大师
  • Leetcode 3576. Transform Array to All Equal Elements
  • 新能源知识库(34)什么是单一制和两部制
  • 【SAP MM SD FICO】销售视图和会计视图
  • C++ 8.1内联函数之宏定义
  • Metasploitable: 1靶场渗透
  • 在postgresql中,group by时取第一个值
  • 网络编程(Modbus进阶)
  • Manus 框架与 COKE 框架解析及完整 Demo