新闻详情

新闻详情

首页 / 资讯中心 / 详情

C语言学习笔记九—— 汉诺塔递归 · 数组作函数参数

发布时间:2026/9/29 9:51:42来源:尧图网络
C语言学习笔记九—— 汉诺塔递归 · 数组作函数参数
内容汉诺塔递归、整型一维数组作函数参数、字符一维数组作函数参数、二维数组作函数参数。一、回顾函数思想高内聚、低耦合把功能拆开输入-处理-输出函数定义、函数调用、函数声明递归思想内存 5 个区栈、堆、全局/静态区、字符串常量区、代码区。二、汉诺塔递归经典题2.1 递归两步写递归必须先想清楚问题 n 和问题 n-1 之间的递推关系结束条件。2.2 思路把 n 个盘子从 A 移到 C借助 B1. 将 n-1 个盘子 从 A → B // 递归 2. 将剩下的那个盘子 从 A → C 3. 将 n-1 个盘子 从 B → C // 递归结束条件n 1直接A → C。注意三个柱子的身份会变起始 辅助 目标 n 个盘子 A B C n-1 A C B2.3 递归展开n3hanoi(3,A,B,C) ├─ hanoi(2,A,C,B) │ ├─ hanoi(1,A,B,C) → move(A,C) // 1:A→C │ ├─ move(A,B) // 2:A→B │ └─ hanoi(1,C,A,B) → move(C,B) // 3:C→B ├─ move(A,C) // 4:A→C └─ hanoi(2,B,A,C) ├─ hanoi(1,B,C,A) → move(B,A) // 5:B→A ├─ move(B,C) // 6:B→C └─ hanoi(1,A,B,C) → move(A,C) // 7:A→C2.4 代码hanoi.c#includestdio.hvoidmove(inta,intb){printf(%c--%c\n,a,b);}// 起始 辅助 目标voidhanoi(intn,intpole1,intpole2,intpole3){if(n1){move(pole1,pole3);// 只有一个盘直接从起始挪到目标}else{hanoi(n-1,pole1,pole3,pole2);// ① 把 n-1 个挪到辅助柱move(pole1,pole3);// ② 把第 n 个挪到目标柱hanoi(n-1,pole2,pole1,pole3);// ③ 把 n-1 个从辅助柱挪到目标柱}}intmain(void){intn;printf(Input a num:);scanf(%d,n);hanoi(n,A,B,C);return0;}带步骤号的详细版hanoi_all_info.c#includestdio.hvoidmove(intn,intpole1,intpole2){staticintstep1;printf(%03d:[disk %d] : %c -- %c\n,step,n,pole1,pole2);}// 起始柱 辅助柱 目标柱voidhanoi(intn,intA,intB,intC){if(1n){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);}}intmain(void){intn0;printf(Input numbers of disk: );scanf(%d,n);hanoi(n,A,B,C);return0;}三、数组作为函数参数3.1 问题引入inta[10]{1,2,3,4};单个元素a[0]就是 int 型变量传给int max(int a, int b)没问题但要把整个数组传进去怎么办3.2 整型一维数组作参数// 形参写法形式上是数组voidprintArray(intx[10],intlen){}// 编译器本质上看成voidprintArray(int*x,intlen){}数组在内存中是一片连续空间数组名从代表的值角度代表的是首元素的地址[ a[0] ] ← 首元素的起始地址 [ a[1] ] [ a[2] ] ...小结写法形参printArray(int a[], int len)数组形式 数组长度本质printArray(int *a, int len)指针接收首元素地址实参printArray(数组名, 数组长度)注意函数内部sizeof(x)拿不到数组长度x 已经退化成指针所以长度必须单独传。3.3 值传递 vs 地址传递实参给形参本质是把实参的值拷贝给形参变量普通变量是值传递函数内改形参不影响外面数组传的是首地址函数内通过地址操作改的就是主函数里那块数组空间——所以reverseArray、selectSort不需要 return 就能改原数组。3.4 基础代码array.c#includestdio.hvoidprintArray(intx[],intlen)// 编译器看成 int *x{inti0;for(i0;ilen;i){printf(%d ,x[i]);}putchar(\n);}voidinputArray(intx[],intlen){inti0;for(i0;ilen;i){scanf(%d,x[i]);}}intmain(void){inta[]{1,2,3,4,5,6};intlensizeof(a)/sizeof(a[0]);inputArray(a,len);printArray(a,len);return0;}3.5 数组常用操作封装test_array.c#includestdio.hvoidprintArray(intx[],intlen){inti0;for(i0;ilen;i){printf(%d ,x[i]);}putchar(\n);}voidinputArray(intx[],intlen){inti0;for(i0;ilen;i){scanf(%d,x[i]);}}// 求最大值intmaxOfArray(intx[],intlen){intmaxx[0];inti0;for(i1;ilen;i){if(x[i]max){maxx[i];}}returnmax;}// 逆序voidreverseArray(intx[],intlen){inti0;intjlen-1;while(ij){inttx[i];x[i]x[j];x[j]t;i;--j;}}// 选择排序voidselectSort(intx[],intlen){inti0,j0;for(i0;ilen-1;i){for(ji1;jlen;j){if(x[i]x[j]){inttx[i];x[i]x[j];x[j]t;}}}}// 二分查找找到返回下标没找到返回 -1intbinaryFind(intx[],intlen,intn){intbegin0;intendlen-1;intmid0;while(beginend){mid(beginend)/2;if(x[mid]n){endmid-1;}elseif(x[mid]n){beginmid1;}else{break;}}returnbeginend?mid:-1;}intmain(void){inta[10]{1,2,3,4,5,6};intlensizeof(a)/sizeof(a[0]);inputArray(a,len);selectSort(a,len);printArray(a,len);intn0;printf(Input a num:);scanf(%d,n);intretbinaryFind(a,len,n);printf(ret %d\n,ret);return0;}四、字符型一维数组作函数参数字符数组用来存字符串字符串本身有 ‘\0’ 结束标志所以作参数时不需要再传长度。chars[]hello;写法形参void Strcpy(char dest[], char src[])实参直接传数组名完整代码char.c手写 string.h 函数#includestdio.h// 手写 putsvoidPuts(chars[]){inti0;while(s[i]!\0){putchar(s[i]);i;}putchar(\n);}// 手写 strlenlongStrlen(chars[]){inti0;while(s[i]!\0){i;}returni;}// 手写 strcpy把 src 拷到 dest最后补 \0voidStrcpy(chardest[],charsrc[]){inti0;while(src[i]!\0){dest[i]src[i];i;}dest[i]\0;}// 手写 strcat把 src 拼到 dest 后面voidStrcat(chardest[],charsrc[]){inti0;// 1. 先定位到 dest 的 \0while(dest[i]!\0){i;}// 2. 从该位置开始把 src 逐个拷过来intj0;while(src[j]!\0){dest[i]src[j];i;j;}// 3. 保证 dest 是字符串dest[i]\0;}// 紧凑写法dest[i] src[j] 会把 \0 一起拷过去voidStrcat1(chardest[],charsrc[]){inti0;while(dest[i]!\0){i;}intj0;while(dest[i]src[j]);}// 手写 strcmp返回停止位置上两个字符的差值intStrcmp(chars1[],chars2[]){inti0;while(s1[i]s2[i]s1[i]!\0s2[i]!\0){i;}returns1[i]-s2[i];}intmain(void){chars[20]hello;gets(s);chars1[20];gets(s1);printf(ret %d\n,Strcmp(s,s1));return0;}五、二维数组作函数参数inta[3][4]{1,2,3,4,5,6,7,8,9,10,11,12};二维数组本质是一维数组的一维数组作参数时// 形式上写成二维数组voidprintArray(inta[3][4]);// 编译器本质上看成指向一维数组的指针voidprintArray(int(*a)[4]);小结写法形参printArray(int a[][4], int row)第二维列数必须写死行数用变量传实参printArray(数组名, 行数)代码2d_array.c#includestdio.hvoidprintArray(intx[][4],introw){inti0,j0;for(i0;irow;i){for(j0;j4;j){printf(%2d ,x[i][j]);}putchar(\n);}}intmain(void){inta[][4]{1,2,3,4,5,6,7,8,9,10,11,12};introwsizeof(a)/sizeof(a[0]);printArray(a,row);return0;}六、作业参考双胞胎素数test_prime.c#includestdio.hintisPrime(intn){inti0;intret1;for(i2;in;i){if(n%i0){ret0;break;}}returnret;}// 打印 n 以内所有素数voidprintPrimeInX(intn){inti0;for(i2;in;i){if(isPrime(i)1){printf(%d ,i);}}putchar(\n);}// 双胞胎素数两个素数相差为 2如 (3,5) (5,7)voidprintTwinsPrimeInX(intn){inti0;for(i2;in-2;i){if(isPrime(i)1isPrime(i2)1){printf((%d,%d)\n,i,i2);}}}intmain(void){intn0;printf(Input a num:);scanf(%d,n);printTwinsPrimeInX(n);return0;}
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

RL-10-赵-Actor-Critic01-在线算法01:QAC【Actor:Policy函数拟合算法】【Critic:Sarsa算法】【π>0,具有探索性】【Q表示action value】 2026/9/29 10:42:54

RL-10-赵-Actor-Critic01-在线算法01:QAC【Actor:Policy函数拟合算法】【Critic:Sarsa算法】【π>0,具有探索性】【Q表示action value】

我们知道基于Monte-Carlo的Policy Gradient算法如下图所示: 我们将估计action values的方法换成“Temporal-difference learning”,现在给出第一个Actor-Critic算法:QAC

阅读更多 →
阿里AI Agent一面复盘:反问拿捏面试官(含LangChain/Multi-Agent/A2A/MCP面试全解) 2026/9/29 10:42:41

阿里AI Agent一面复盘:反问拿捏面试官(含LangChain/Multi-Agent/A2A/MCP面试全解)

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

阅读更多 →
量化求真11|设了回撤线,为什么还能继续亏? 2026/9/29 10:42:02

量化求真11|设了回撤线,为什么还能继续亏?

前言|一个容易被误读的“停止线” 研究者给策略设了10%的回撤停止线,以为账户最多亏到这里。某天收盘,净值已经跌到线下;系统安排次日减仓,第二天却遇到跳空。卖出之前,账户继续下跌。看着超过10%的实际回…

阅读更多 →
MEMS传感器芯片前沿:低功耗振荡器、MEMS振镜与压感原理 2026/9/29 10:42:02

MEMS传感器芯片前沿:低功耗振荡器、MEMS振镜与压感原理

做嵌入式硬件这行,MEMS传感器芯片几乎每天都在接触。手机里的加速度计、汽车里的胎压计、扫地机里的陀螺仪、激光雷达里的MEMS振镜、智能手表里的MEMS振荡器,说白了都是同一套微米级机械结构在干活。2025到2026年这个时间窗口,整个行业明显不…

阅读更多 →
2026 AI 论文工具排行榜|按「投入产出效率」专项测评 2026/9/29 10:41:55

2026 AI 论文工具排行榜|按「投入产出效率」专项测评

挑选 AI 论文工具,很多同学容易盲目跟风,只看能不能生成文字,忽略时间成本、学习成本、配套功能。本次榜单以投入产出效率作为核心评判标准,同样的毕设任务,哪个工具花费时间更少、配套功能更全、踩坑风险更低&#xf…

阅读更多 →
帆软7.0使用手册 2026/9/29 10:41:55

帆软7.0使用手册

一、相关术语了解1.ERP:企业资源计划系统 2.宽维度表:字段较多,包含较多描述属性的维度表 指标:需要计算或观察的业务数值 维度:观察指标的角度 3.OLTP 和 OLAP 是架构思想/系统类型 OLTP(联机事务处理&am…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉