王道考研C语言第五周

什么是递归?使用递归的代码和使用循环的代码哪个性能更好一些?

简单来说就是自己调用自己,把大问题分解成小问题,有点像数学归纳法,函数的的出口就是n=1、n=2这样容易证明的初始条件,假设到k已经成立了,推出k+1成立,

递归相对于枚举的话容易写一点,但是递归的时间复杂度难说

递归就是在函数定义里面直接或者间接调用本函数

通常使用递归的代码性能会弱于循环的代码,因为函数调用的时候会申请栈帧

使用分治法的基本流程有哪些步骤?如果想好了分治法的算法方案如何写出C代码?

见上面

栈溢出有几种可能?分别是什么原因导致的?

栈溢出有两种可能性:

1、单个调用函数当中局部变量太多超过栈帧的限制

2、递归调用的深度太大导致栈溢出

OJ习题C语言学习 | week05_递归求最大公约数

这里有两个办法辗转相减法这辗转相除法,理解起来其实也不难,

相减法

我们都认同一个公理对于一个数a最大的因子就是本身,或者说如果又两个数,a,b假设a<b那我们假设有个最大的数gcd,所以一定有gcd*x=a,gcd*(x+Y)=b,那么不难发现b-a=gcd*y,a=gcd*x所以Gcd(a,b)=Gcd(a,b-a)

相除法

两个数,a,b假设a<b那我们假设有个最大的数gcd,所以一定有gcd*x=a,gcd*(x+Y)=b

b/a=x+Y/x,假如y/x是整数那就皆大欢喜,不是的话就相当于GCd(b,b%a);

cpp 复制代码
int Gcd(int a, int b)
{
	if (a == b)return a;
	if (a > b)return Gcd(a - b, b);
	if (b > a)return Gcd(a, b - a);
}
cpp 复制代码
   int Gcd(int a, int b) {
       return b == 0 ? a : Gcd(b, a % b);
   }

OJ习题C语言学习 | week05_递归进制转换

cpp 复制代码
#include <stdio.h>
void ToOct(int a)
{
	if (a < 8)
	{
		printf("%d", a);
	}
	else
	{	
		ToOct(a / 8);
		printf("%d", a % 8);
	}
}
int main()
{
  int data;
  while(scanf("%d",&data)!=EOF)
  {
	ToOct(data);
    print("\n");
  }
  
  return 0;
}

所以从这个题中可以很好的理解辗转相除法

我觉得这个真不好想

对于任意一个数其实都可以看成进制权重乘一个数,然后加一个小于满进制得的数,eg

1211=121*10+1;

63=8*7+7 所以他的八进制就是77

511的八进制是777怎么理解

504+7=(63)*8+7;=(56+7)*8+7=((7*8)+7)*8+7=7*8^2+7*8^1+7*8^0;

77777表示有深度有4层,

其实这里很精彩,奈何我表达能力有限,想探讨的可以私我

OJ习题C语言学习 | week05_吃糖果

cpp 复制代码
int CandyProblem(int n)
{
	if (n == 1 || n == 2)return n;
	else return CandyProblem(n - 1) + CandyProblem(n - 2);
}

OJ习题C语言学习 | week05_直线分平面(提示:在离交点足够远的位置,一条新直线总是可以穿过所有的其他直线)

cpp 复制代码
int PlanDivide(int n)
{
	if (n == 1)return 2;
	else return PlanDivide(n - 1) + n;
}

int main()
{
	//int m, n;
	//scanf_s("%d,%d", &m, &n);
	//int ans = Gcd(m, n);
	//printf("%d", ans);
	/*ToOct(17);*/


	int n;
	while (scanf_s("%d", &n) != EOF)
	{
		printf("%d\n", PlanDivide(n));
	}



	return 0;
}

OJ习题C语言学习 | week05_折线分平面

cpp 复制代码
long DivideByPolyline(int n)
{
	if (n == 1)return 2;
	else return DivideByPolyline(n - 1) + 4 * (n-1) + 1;
}
int main()
{
	//int m, n;
	//scanf_s("%d,%d", &m, &n);
	//int ans = Gcd(m, n);
	//printf("%d", ans);
	/*ToOct(17);*/


	int n;
	while (scanf_s("%d", &n) != EOF)
	{
		printf("%d\n", DivideByPolyline(n));
	}



	return 0;
}

OJ习题C语言学习 | week05_骨牌

cpp 复制代码
int Laytiles(int n)
{
	if (n == 1)return 1;
	if (n == 2)return 2;
	if (n == 0)return 0;
	else return Laytiles(n - 1)+Laytiles(n-2)+Laytiles(n-3);
}
相关推荐
yi0117 小时前
LeetCode 219:存在重复元素 II——哈希表记录“最近一次出现的位置”
数据结构·人工智能·笔记·python·算法·leetcode·哈希表
Escalating_xu9 小时前
【C 语言】数据在内存中的存储:补码、大小端、整型陷阱与 IEEE 754 全解析
java·c语言·网络
灯澜忆梦10 小时前
【面向对象编程C++】| 基础语法
java·c++·算法
小蒋观天下10 小时前
专项方案:大场景港口AI安防、多干扰环境下的算法调优与落地实操
人工智能·深度学习·算法·安全·机器学习·计算机视觉·ai大模型
Evand J10 小时前
【电机滤波例程5】渐消因子自适应扩展卡尔曼滤波(EKF),MATLAB。PMSM负载突变下的状态估计。附下载链接
算法·matlab
H.莓飛10 小时前
【数据结构】二叉树_OJ题
linux·开发语言·数据结构·算法
好想像大佬一样能够ak所有11 小时前
Leetcode35.搜索插入位置
数据结构·算法·leetcode
aqiu11111111 小时前
【C++算法打怪专栏】LeetCode 165. 比较版本号(双指针与字符串流法)
c++·算法·leetcode
黄金龙PLUS11 小时前
如何基于置换算法来设计对称加密算法
算法·网络安全·密码学·哈希算法·同态加密
不会就选b11 小时前
算法日常・每日刷题--<动态规划>14
算法