递归递推 C

C

给定一个函数 f(a, b, c):
如果 a ≤ 0 或 b ≤ 0 或 c ≤ 0 返回值为 1;
如果 a > 20 或 b > 20 或 c > 20 返回值为 f(20, 20, 20);
如果 a < b 并且 b < c 返回 f(a, b, c−1) + f(a, b−1, c−1) − f(a, b−1, c);
其它情况返回 f(a−1, b, c) + f(a−1, b−1, c) + f(a−1, b, c−1) − f(a-1, b-1, c-1)。

这题很简单,函数比着写出来就可以了,但很显然的一个问题,超时。

看了几遍,只能用记忆话搜索解决。

代码如下:


#include<bits/stdc++.h>
using namespace std;
int f[21][21][21];
int ff(int a,int b,int c)
{

	if(a<=0||b<=0||c<=0)
		return 1;
	if(a>20||b>20||c>20)
		return ff(20,20,20);
			if(f[a][b][c]!=-1)
		return f[a][b][c];
	else if(a<b&&b<c)
		return f[a][b][c]=ff(a,b,c-1)+ff(a,b-1,c-1)-ff(a,b-1,c);
	else
		return f[a][b][c]=ff(a-1,b,c)+ff(a-1,b-1,c)+ff(a-1,b,c-1)-ff(a-1,b-1,c-1);
}
int main()
{
	memset(f,-1,sizeof(f));
	int a,b,c;
	while(cin>>a>>b>>c)
		cout<<ff(a,b,c)<<endl;
	return 0;
}












<think>嗯,用户的问题是关于蓝桥杯竞赛中涉及递归递推的编程题目,想要寻找相关的解法。首先,我需要回忆一下蓝桥杯常见的递归递推题型。比如,斐波那契数列、阶乘计算、杨辉三角、全排列、汉诺塔这些应该都是常见的例子。用户提供的引用里提到了杨辉三角的组合数计算,用的是递归方法,但效率低,可能动态规划更好。所以,我需要整理这些典型题目,并给出解法思路和代码示例,同时分析优缺点。 接下来,用户可能需要具体的例子来理解如何应用递归递推。比如斐波那契数列,递归虽然简单但会有重复计算,递推或动态规划更高效。另外,汉诺塔问题也是递归的经典案例,可以详细说明递归步骤。全排列问题可以通过递归生成所有可能的排列,这里需要注意回溯的应用。 还要考虑用户提到的蓝桥杯竞赛中的实际题目,可能需要举一些蓝桥杯历年真题的例子,比如楼梯方案数、数字三角形等。这些题目通常会有递推关系,需要找到状态转移方程。例如,楼梯问题可以分解为最后一步走1阶或2阶,从而得到递推公式。 在代码实现方面,用户提供的例子中有C和Python的代码,可能需要保持一致性,但用户现在可能需要Python的例子,因为之前的快速排序示例用了Python。不过,蓝桥杯竞赛中C/C++也是常用语言,所以可能需要兼顾,但根据用户的问题,可能更倾向于Python? 另外,用户的问题中还提到了优化方法,比如递归的缺点和如何用递推或记忆化优化。比如斐波那契数列的递归解法效率低,可以改为递推或者使用记忆化缓存中间结果,这样能提升性能,避免重复计算。 然后,生成相关问题的时候,需要考虑用户可能进一步想知道递归递推的区别,如何选择,或者更复杂的题目,比如路径问题、图遍历等。同时,用户可能对动态规划感兴趣,因为引用里提到了动态规划作为解法之一,可能需要解释递归递推和动态规划之间的关系。 总结下来,回答的结构应该包括递归递推的概念,典型例题及解法(包括代码),优化方法,以及相关的问题。需要确保代码示例正确,并符合用户给出的LaTeX格式要求,行内公式用$...$,独立公式用$$...$$。同时,引用文献需要正确标注,比如杨辉三角的例子来自引用[2]。 还要注意用户可能存在的深层需求,比如如何训练递归思维,如何识别题目中的递推关系,或者如何将递归转化为递推以提高效率。所以在回答中应该涵盖这些方面,帮助用户不仅解决当前题目,还能提升解题能力。</think>### 蓝桥杯竞赛中的递归递推编程题解法 递归递推是算法竞赛中的核心思想,尤其在蓝桥杯题目中高频出现。以下是典型题型及解法分析: --- #### 一、递归递推的核心概念 1. **递归**:通过函数调用自身解决问题,需明确**终止条件**和**递归关系**。 - 优点:代码简洁,逻辑直观。 - 缺点:栈溢出风险高,重复计算多,效率低[^2]。 2. **递推**:通过已知条件逐步推导后续状态,通常用循环实现。 - 优点:效率高,无栈溢出问题。 - 缺点:状态转移方程设计复杂。 --- #### 二、典型例题与解法 ##### 1. 斐波那契数列(递归 vs 递推) - **递归实现** $$F(n) = F(n-1) + F(n-2), \quad F(0)=0, F(1)=1$$ ```python def fib_recursive(n): if n <= 1: return n return fib_recursive(n-1) + fib_recursive(n-2) ``` - 问题:重复计算导致时间复杂度 $O(2^n)$。 - **递推优化(动态规划)** ```python def fib_dp(n): if n == 0: return 0 a, b = 0, 1 for _ in range(2, n+1): a, b = b, a + b return b ``` - 时间复杂度优化至 $O(n)$。 ##### 2. 杨辉三角(组合数计算) - **递推公式** $$C(n, k) = C(n-1, k-1) + C(n-1, k)$$ 引用代码中的递归实现(效率低)可改为递推: ```python def combination(n, k): dp = [[0]*(k+1) for _ in range(n+1)] for i in range(n+1): for j in range(min(i, k)+1): if j == 0 or j == i: dp[i][j] = 1 else: dp[i][j] = dp[i-1][j-1] + dp[i-1][j] return dp[n][k] ``` - 时间复杂度 $O(nk)$,空间复杂度 $O(nk)$。 ##### 3. 汉诺塔问题(经典递归) - **递归逻辑**:将 $n$ 个盘子从 A 移动到 C,需先移动 $n-1$ 个到 B,再将第 $n$ 个移到 C,最后将 $n-1$ 个从 B 移到 C。 ```python def hanoi(n, A, B, C): if n == 1: print(f"Move disk 1 from {A} to {C}") return hanoi(n-1, A, C, B) print(f"Move disk {n} from {A} to {C}") hanoi(n-1, B, A, C) ``` - 时间复杂度 $O(2^n)$,步骤数为 $2^n - 1$。 --- #### 三、蓝桥杯真题示例 ##### 题目:楼梯方案数(递推应用) **描述**:楼梯有 $n$ 阶,每次可走 1 或 2 阶,求到达顶部的方案数。 **递推公式**: $$dp[i] = dp[i-1] + dp[i-2], \quad dp[0]=1, dp[1]=1$$ **代码实现**: ```python def climb_stairs(n): if n <= 1: return 1 a, b = 1, 1 for _ in range(2, n+1): a, b = b, a + b return b ``` ##### 题目:数字三角形(递推+路径规划) **描述**:从三角形顶部到底部的路径最大和。 **递推逻辑**:从底向上更新每层的最大值。 $$dp[i][j] = \max(dp[i+1][j], dp[i+1][j+1]) + triangle[i][j]$$ ```python def max_path(triangle): n = len(triangle) dp = triangle[-1].copy() for i in range(n-2, -1, -1): for j in range(i+1): dp[j] = max(dp[j], dp[j+1]) + triangle[i][j] return dp[0] ``` --- #### 四、优化策略 1. **递归优化**: - 记忆化(缓存中间结果),如斐波那契数列使用 `@lru_cache` 装饰器。 2. **递推优化**: - 状态压缩(如斐波那契数列仅保留前两个状态)。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值