C语言-函数递归

1.接收一个整型值(无符号),按照顺序打印它的每一位

复制代码
#include<stdio.h>

//接受一个整型值(无符号),按照顺序打印它的每一位
//例如:
//输入:1234  ,输出:1 2 3 4
//%d 是打印有符号的整数(会有正负数)
//%u 是打印无符号的整数

//输入12345  打印: 5 4 3 2 1 
int main() {
	unsigned int num = 0;
	scanf("%u", &num);//1234
	//printf("%u\n",num);
	while (num) {
		printf("%d ", num % 10);//输入:123456  输出:6 5 4 3 2 1 
		num = num / 10;
	}
	return 0;
}

2.真正递归实现(接收一个整型值(无符号),按照顺序打印它的每一位)

复制代码
#include<stdio.h>
//真正的递归实现
//递归函数
void print(unsigned int n) {
	if (n>9)//没有这个条件可能会栈溢出
	{
		print(n / 10);//123
	}
	printf("%d ", n % 10);//4
}
int main() {
	unsigned int num = 0;
	scanf("%u", &num);//1234
	print(num);//接收一个整型值(无符号),按照顺序打印它的每一位
	return 0;
}

3.求字符串的长度

复制代码
#include<stdio.h>
//求字符串的长度
#include<string.h>
int main() {
	int len = strlen("abc");
	printf("%d\n", len);
}

4.编写函数时不允许创建临时变量,求字符串的长度

复制代码
#include<stdio.h>
//编写函数时不允许创建临时变量,求字符串的长度
//模拟实现strlen
#include<string.h>
//int my_strlen(char str[])//参数部分写出数组的形式
////一:创建了临时变量求解
//int my_strlen(char* str) {//参数部分写出指针的形式(本质和上述代码相同)
//	int count = 0;//计数,临时变量
//	while (*str!='\0') {
//		count++;
//		str++;//指针移动,找下一个字符
//	}
//	return count;
//}
//二:递归求解
//my_strlen("abc");
//1+my_strlen("bc");
//1+1+my_strlen("c");
//1+1+1+my_strlen("");
//1+1+1+0
int my_strlen(char* str) {
	if (*str != '\0') {
		return 1 + my_strlen(str + 1);//注意此处不能改为str++,因为这是后置++
	}
	else
	{
		return 0;
	}
}
int main() {
	char arr[] = "abc";//[a b c \0]
	//char*
	//int len = my_strlen("abc");//传递的也是首地址
	int len = my_strlen(arr);
	printf("%d\n", len);
}

5.递归求n的阶乘

复制代码
#include<stdio.h>
//递归与迭代
//递归求n的阶乘
//int fac(int n) {
//	if (n<1)
//	{
//		return 1;
//	}
//	else {
//		return n * fac(n - 1);
//	}
//}
//循环(迭代)求n的阶乘
int fac(int n) {
	int i = 0;
	int ret = 1;
	for ( i = 1; i <=n; i++)
	{
		ret *= i;
	}
	return ret ;
}
int main() {
	int n = 0;
	scanf("%d", &n);
	int ret = fac(n);
	printf("ret = %d\n", ret);
	return 0;
}

6.求第n个斐波那契数

复制代码
#include<stdio.h>
//求第n个斐波那契数
//斐波那契数列
//1 1 2 3 5 8 13.....
//int Fib(int n) {
//	if (n<=2)
//	{
//		return 1;
//	}
//	else
//	{
//		return Fib(n - 1) + Fib(n - 2);
//	}
//}
////40
////39  38
////38 37  37 36
////37 36 36 35 36 35 35 34
////用递归存在大量重复的计算

//用非递归方式解决斐波那契数列
int Fib(int n) {
	int a = 1;
	int b = 1;
	int c = 0;

	while (n >= 3) {
		c = a +b;
		a = b;
		b = c;
		n--;
	}
	return c;
}
int main() {
	int n = 0;
	scanf("%d", &n);
	int ret = Fib(n);
	printf("ret = %d\n", ret);

}
相关推荐
mjhcsp2 小时前
C++Z 函数超详细解析
c++·算法·z 函数
近津薪荼2 小时前
dfs专题9——找出所有子集的异或总和再求和
算法·深度优先
52Hz1182 小时前
力扣131.分割回文串、35.搜索插入位置、74.搜索二维矩阵、34.在排序数组中查找...
python·算法·leetcode
Tisfy2 小时前
LeetCode 761.特殊的二进制字符串:分治(左右括号对移动)
算法·leetcode·字符串·递归·分治
小O的算法实验室2 小时前
2025年AEI SCI1区TOP,面向城市区域监视的任务驱动多无人机路径规划三阶段优化策略,深度解析+性能实测
算法·论文复现·智能算法·智能算法改进
癫狂的兔子2 小时前
【Python】【机器学习】集成算法(随机森林、提升算法)
python·算法·机器学习
小龙报3 小时前
【算法通关指南:数据结构与算法篇】二叉树相关算法题:1.二叉树深度 2.求先序排列
c语言·开发语言·数据结构·c++·算法·贪心算法·动态规划
吾在学习路3 小时前
AoP-SAM: Automation of Prompts for Efficient Segmentation
人工智能·深度学习·算法·计算机视觉
再难也得平3 小时前
[LeetCode刷题]1.两数之和(java题解)
java·算法·leetcode