C语言学习笔记20260520之递归与迭代
一.递归核心三要素
递归是编程中非常经典的思想,核心是函数自己调用自己,把大问题拆成相同结构的小问题,直到无法再拆分(终止条件)。
写递归前,必须先想清楚这三点:
1.函数的作用:这个递归函数是干嘛的?输入是什么?输出是什么?
2. 终止条件(出口):什么时候不再递归?没有它会无限调用,导致栈溢出崩溃。
3. 递推公式(核心逻辑):怎么把大问题拆成更小的子问题?子问题和原问题的关系是什么?
二.递归两个必要条件
1.存在限制条件,当满足这个限制条件的时候,递归便不再继续。
2.每次递归调用之后越来越接近这个限制条件。
三.3个递归例子代码
#define_CRT_SECURE_NO_WARNINGS#include<stdio.h>// 递归拆分正整数的每一位voidprintPos(intn){if(n>9){printPos(n/10);}printf("%d ",n%10);}////print(123)//→ 123 > 9 → print(12)//→12 > 9 → print(1)//→1 < 9 → 输出 1 % 10 → 1// → 回到 print(12) → 输出 12 % 10 → 2// → 回到 print(123) → 输出 123 % 10 →3// 包装函数:处理正负voidprint(intn){if(n<0){printf("- ");// 输出负号n=-n;// 转为正数}elseif(n==0){printf("0");// 0单独处理return;//遇到return,直接跳出函数,比break更直接,更彻底。}printPos(n);}//求字符串的长度intStrlen(constchar*str)//const 表示不会修改字符串{// 防止空指针,增强鲁棒性if(str==NULL)return0;// 递归结束:到字符串末尾if(*str=='\0')return0;// 递归计数return1+Strlen(str+1);}//递归执行过程//Strlen("abcdef")//= 1 + Strlen("bcdef")//= 1 + 1 + Strlen("cdef")//= 1 + 1 + 1 + Strlen("def")//= 1 + 1 + 1 + 1 + Strlen("ef")//= 1 + 1 + 1 + 1 + 1 + Strlen("f")//= 1 + 1 + 1 + 1 + 1 + 1 + Strlen("")//= 1 + 1 + 1 + 1 + 1 + 1 + 0//= 6//求整数 n 的阶乘//功能:输入 n,输出 n!= n ×(n - 1) × ... × 1//负数返回-1,0和1返回1,其他数使用递归longlongfactorial(intn)//long long 类型,最大只能计算 20!{if(n<0){printf("错误:负数不能求阶乘\n");return-1;}elseif(n<=1){return1;}elseif(n>20){printf("错误:不能计算20以上的阶乘\n");return-1;}else{returnn*factorial(n-1);}}intmain(){intnum=0;printf("请输入一个整数:\n");scanf("%d",&num);printf("\n%d拆分为:",num);print(num);char*p="abcdef";intlen=Strlen(p);printf("\n");printf("\n* p的字符串长度 = %d\n",len);printf("\n");intn=0;printf("请输入一个小于等于20的整数:\n");scanf("%d",&n);longlongret=factorial(n);if(ret!=-1){printf("%d 的阶乘 = %lld\n",n,ret);}return0;}