【蓝桥杯-筑基篇】递归-递推

本文介绍了递归算法的基本思想,并通过四个实例——求阶乘、斐波那契数列、汉诺塔问题和递推连分式开根号——详细展示了递归在编程中的应用。每个示例都包含具体的Java代码实现,帮助读者理解递归如何解决问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

🍓系列专栏:蓝桥杯

🍉个人主页:个人主页

目录

🍉1.求阶乘🍉

🍍2.斐波那契数列🍍

🍊3.汉诺塔🍊

🥝4.递推连分式开根号🥝


递归算法的基本思想是:把规模大的、较难解决的问题变成规模较小的、易解决的同一问题。规模较小的问题又变成规模更小的问题,并且小到一定程度可以直接得出它的解,从而得到原来问题的解。

书写递归时我们要考虑好以下三步:

这个函数从哪里开始?
这个函数从哪里结束?
这个函数每一步需要干什么?
 

🍉1.求阶乘🍉

例如:利用递归来求1到5的阶乘。5! = 5 * 4! ,4! = 4 * 3!,3! = 3 * 2!, 2! = 2 * 1!,1!=1;

所以可总结出当n>1时可用n!=n * (n-1)!来计算,当n=1或n=0时n!为1,因此可以得出以下代码。

public class A {
    public static void main(String[] args) {
 
    	for (int j = 1; j <= 5; j++) {
    		System.out.println(factorial(j));
		}
    	 
 	

    }

	private static int factorial(int i) {
		// TODO Auto-generated method stub
		if(i==1) {
			return 1;
		}
		else return i*factorial(i-1);
		
	}

}

这个方法会一直调用自己,直到  i  等于 1,然后返回 1。如果 i 不等于 1,就返回  i  乘以 factorial(  i - 1) 的结果。

🍍2.斐波那契数列🍍

斐波那契数列(Fibonacci sequence),又称黄金分割数列、因数学家莱昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为“兔子数列”,

指的是这样一个数列:0、1、1、2、3、5、8、13、21、34、……在数学上,斐波那契数列以如下被以递推的方法定义:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 3,n ∈ N*)
 

public class Fibonacci {
public static int fibonacci(int n) {
if (n <= 1) {
return n;
} else {
return fibonacci(n-1) + fibonacci(n-2);
}
}
}

在这个代码中,我们使用递归的方式来实现斐波那契数列。如果 n 小于等于 1,我们直接返回 n。否则,我们递归地计算 fibonacci(n-1) 和 fibonacci(n-2),并将它们相加返回。

🍊3.汉诺塔🍊

汉诺塔(Tower of Hanoi),又称河内塔。源自印度古老传说的一个游戏,大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
 

推荐视频:递归,汉诺塔,最全面的讲解,没有之一_哔哩哔哩_bilibili

public class A {
    public static void main(String[] args) {
        int n = 3; // 汉诺塔的层数
        hanoi(n, 'A', 'B', 'C');
    }

    public static void hanoi(int n, char from, char temp, char to) {
        if (n == 1) {
            System.out.println("Move disk 1 from " + from + " to " + to);
        } else {
            hanoi(n - 1, from, to, temp);
            System.out.println("Move disk " + n + " from " + from + " to " + to);
            hanoi(n - 1, temp, from, to);
        }
    }
}

🥝4.递推连分式开根号🥝

public class SqrtDitui {

	public static void main(String[] args) {
		System.out.println(Math.sqrt(2));
		double ans=0;
		for(int i=1;i<=100;i++) ans=1.0/(2+ans);//x=1/(2+x)
		System.out.println(ans+1);
	}
}
1.4142135623730951
1.4142135623730951

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

热爱编程的小白白

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值