趣味算式 蓝桥杯 110 递归

 匪警请拨110,即使手机欠费也可拨通!
    为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
    某批警察叔叔正在进行智力训练:
    1 2 3 4 5 6 7 8 9 = 110;
    请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。
    请你利用计算机的优势,帮助警察叔叔快速找到所有答案。
    每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
    已知的两个答案可以输出,但不计分。



public class Qu110_2 {
	String[] num={"1","2","3","4","5","6","7","8","9"};
	public static void main(String[] args) {
		getStr(1, "1");
	}
	public static void getStr(int t,String str){
		if(t==9){
			if( computer(str)){
				System.out.println(str);
			}
			return;
		}
		for (int i = 0; i <3; i++) {
			if(i==0){
				getStr(t+1, str+String.valueOf(t+1));
			}else if(i==1){
				getStr(t+1, str+"+"+String.valueOf(t+1));
			}else if(i==2){
				getStr(t+1, str+"-"+String.valueOf(t+1));
			}
		}
	}
	public static boolean computer(String s){
		int aim=0;
		String[] t1s=s.split("\\+");
		for (String string : t1s) {
			String[] t2s=string.split("\\-");
			int t=Integer.valueOf(t2s[0]);
			for (int i = 1; i < t2s.length; i++) {
				t-=Integer.valueOf(t2s[i]);
			}
			aim+=t;
		}
		if(aim==110){
			return true;
		}else{
			return false;
		}
	}
}



<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. **递推优化**: - 状态压缩(如斐波那契数列仅保留前两个状态)。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值