递归和动态规划

  1. 递归与动态规划的比较
  •      当递归中只有一部分未解决如 例1 所示时,使用递归比使用动态规划更方便快捷。                                                                      
  •      当递归中两部分甚至更多都为解决如 例2 所示时,使用动态规划比使用递归更快。

            当递归中出现两部分未解决时,使用递归会重复计算子问题,增加程序的时间复杂度。

   当仅有一部分未解决时,相当于一层循环,使用递归程序简洁。

// 例 1 以 1 到 n 的和为例  (递归)

static int f(int n){

if(n == 1) return 1;

return n + f(n-1);
} 



// 例 2 以斐波那契数列为例 (递归)

static int f2(int n){

if(n < 3) return 1;

return f2(n-1) + f2(n-2);

}

// 例 3 以斐波那契数列为例 (动态规划)

static int f3(int[] f){

f[0] = 1; 

f[1] = 1;

for(int i = 2; i < f.length; i++){

f[i] = f[i-1] + f[i - 2];

}

return f[f.length - 1];

}

 

### 递归动态规划的主要差异 #### 定义与特性 递归是一种编程方法,在这种方法中,函数通过调用自身来解决问题。这种技术特别适用于那些可以通过分解成较小的相同问题来解决的情况[^2]。 相比之下,动态规划(Dynamic Programming, DP)则专注于优化重叠子问题的解决方案存储机制。当一个问题可以被划分为多个相互依赖的小型子问题时,动态规划能够有效地减少计算量并提升效率。特别是对于存在大量重复计算的情形下,动态规划的优势尤为明显[^3]。 #### 子问题处理方式 在递归过程中,每次遇到一个新的子问题都会触发新的递归调用;然而这可能导致大量的冗余运算,因为相同的子问题可能会被多次独立求解。例如,在斐波那契序列计算中,不加记忆化的简单递归会引发指数级增长的时间开销。 相反地,动态规划采用自底向上的策略构建解答路径——即从小到大地逐步累积已知的结果直至最终目标达成。这样做不仅避免了不必要的重复工作,而且使得整个过程更加高效有序。 #### 应用场景比较 - **适合使用递归的情景** - 当前问题是天然具备层次结构或树形分支特征的任务; - 需要清晰表达逻辑关系而不必过分关注性能瓶颈的应用场合。 - **更适合应用动态规划的例子** - 对于具有显著重叠性质的最优化类题目; - 寻找全局最优解而非局部极值的问题领域; - 数据集较大且涉及频繁访问历史状态更新当前决策的过程[^1]。 ```python def fibonacci_recursive(n): if n <= 1: return n else: return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) def fibonacci_dp(n): fib = [0]*(n+1) fib[1] = 1 for i in range(2,n+1): fib[i]=fib[i-1]+fib[i-2] return fib[n] ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值