递归入门

写在前面:

对于强大的递归。要想做到灵活运用,是需要花时间进行练习并总结。往往递归学习的入门也是难度也比较大,常常会处于看得明,却写不出的"尴尬"情况。

本人也是一名编程菜鸟,也常处于尴尬中。正因递归的学习需要一个过程,所以萌生一个想法,对于每一次的递归学习都写篇博文总结,与大家分享,共同进步!

在此推荐一本学习递归较好的的入门书:《程序设计抽象思想:C语言描述》 。本文章也引用了书中的对递归要点的理解和描述。

如果对递归学习此系列的文章有任何的建议或批评,欢迎指出!

*文章练习会不定期进行更新


递归的简单介绍和要点梳理

递归维基百科

递归百度百科

递归互动百科

递归的定义:

将一个大的问题分解成比较小的、有着相同形式的问题。

递归是一种强有力的思想。在计算机科学的学习中,一个重要的必须学习的概念是递归。递归是一种编程策略,它把一个大的问题分解成具有相同形式的简单问题。


递归示例:(可以按照以下顺序逐步练习递归)


使用递归的必需条件

  1. 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式
  2. 存在一种简单情境,可以使递归在简单情境下退出

一般对递归思想的介绍,都是说将大问题分解为一个个小问题。本人觉得,带着 “如何将问题规模缩少”的思想 比 “将大问题分解为一个个小问题” 的思想要更好地编写递归程序。


递归跳跃的信任

当尝试理解递归程序时,必须能够抛开底层的细节,将注意力集中在单个计算层次上。在这个层次上,只要一个递归调用的参数在某些方面能比前一个参数更简单,那么就可以认为任何递归调用都能够自动地得到正确的答案。这种心理策略——假设任何更简单的递归都能正确地实现——叫做对递归跳跃的信任。在实际应用中,学习应用这个策略是使用递归的基础。


以递归的方式思考

保持整体观:递归思维要求整体考虑。在递归领域中,只考虑局部是理解的敌人,将会妨碍对递归的理解。为了保持这种整体观,必须习惯于采用对递归跳跃的信任。无论是在写递归程序或是理解递归程序,都必须达到忽视单个递归调用细节的地步。只要选择了正确的分解,确认了相应的简单情景,并且正确地实现了策略,那么这些递归调用能够自己运行,不必过多考虑。


避免常见的错误

  1. 检验递归实现是不是以检查简单情景开始。在几乎所有情况中,递归函数都开始于关键字 if 。如果你的函数不是这样,那么应该仔细检查程序并确信知道自己在做什么
  2. 正确地解决了简单情景了吗?在递归程序中很多bug都是起源于简单情景的不正确解决。如果简单情景是错误的,那么对更复杂问题的递归解决将会继承相同的错误
  3. 递归分解使问题更加简单了吗?递归的作用在于,随着问题解决的进行,它将变得越来越就简单。即每一次递归调用中,参数值将会越来越小
  4. 简化的过程是不是逐渐地达到了简单情景,或者是不是遗漏了一些可能性?常见的一个错误就是没有将全部情况的简单情景测试都包括其中,这些情况可能作为递归分解的结果而产生出来。简单说:你需要正确地将所有的简单情景分析出来
  5. 函数中的递归调用是不是表示了在形式上和初始问题真的完全相同的子问题?当使用递归分解问题时,关键在于子问题形式的同一性。如果递归调用改变了问题的本性,或者违反了一个初始化的假设,那么全部过程就被破环
  6. 当使用对递归跳跃的信任时,递归子问题的解决方案是否对初始问题提供了一个完整的解决方案?将一个问题分解为递归子问题仅仅是递归过程的一部分,一旦子问题得到了解决,那么也必须能够将他们重新组装从而得到全部的答案


在示例练习中会尽量以上述几点为基础去思考问题的解法






  • 14
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
在信号处理领域,DOA(Direction of Arrival)估计是一项关键技术,主要用于确定多个信号源到达接收阵列的方向。本文将详细探讨三种ESPRIT(Estimation of Signal Parameters via Rotational Invariance Techniques)算法在DOA估计中的实现,以及它们在MATLAB环境中的具体应用。 ESPRIT算法是由Paul Kailath等人于1986年提出的,其核心思想是利用阵列数据的旋转不变性来估计信号源的角度。这种算法相比传统的 MUSIC(Multiple Signal Classification)算法具有较低的计算复杂度,且无需进行特征值分解,因此在实际应用中颇具优势。 1. 普通ESPRIT算法 普通ESPRIT算法分为两个主要步骤:构造等效旋转不变系统和估计角度。通过空间平移(如延时)构建两个阵列,使得它们之间的关系具有旋转不变性。然后,通过对阵列数据进行最小二乘拟合,可以得到信号源的角频率估计,进一步转换为DOA估计。 2. 常规ESPRIT算法实现 在描述中提到的`common_esprit_method1.m`和`common_esprit_method2.m`是两种不同的普通ESPRIT算法实现。它们可能在实现细节上略有差异,比如选择阵列的方式、参数估计的策略等。MATLAB代码通常会包含预处理步骤(如数据归一化)、阵列构造、旋转不变性矩阵的建立、最小二乘估计等部分。通过运行这两个文件,可以比较它们在估计精度和计算效率上的异同。 3. TLS_ESPRIT算法 TLS(Total Least Squares)ESPRIT是对普通ESPRIT的优化,它考虑了数据噪声的影响,提高了估计的稳健性。在TLS_ESPRIT算法中,不假设数据噪声是高斯白噪声,而是采用总最小二乘准则来拟合数据。这使得算法在噪声环境下表现更优。`TLS_esprit.m`文件应该包含了TLS_ESPRIT算法的完整实现,包括TLS估计的步骤和旋转不变性矩阵的改进处理。 在实际应用中,选择合适的ESPRIT变体取决于系统条件,例如噪声水平、信号质量以及计算资源。通过MATLAB实现,研究者和工程师可以方便地比较不同算法的效果,并根据需要进行调整和优化。同时,这些代码也为教学和学习DOA估计提供了一个直观的平台,有助于深入理解ESPRIT算法的工作原理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值