【问题标题】:Examples of Recursion uses递归使用示例
【发布时间】:2011-08-07 15:44:58
【问题描述】:

什么是使用递归的例子(几乎没有解释和/或代码示例)?

【问题讨论】:

    标签: recursion


    【解决方案1】:

    用途:解析;遍历;生成分形;某些形式的加密

    示例:河内塔;斐波那契序列;子集生成(有大量示例,如果您愿意,我可以为您编写其中的一些代码?)

    优点:简单;对某些问题很直观(例如 Ackermann 函数、遍历)

    缺点:慢(尽管您可以使用堆栈实现任何递归解决方案);可能会导致stackoverflow异常

    如果有人对加密有疑问,以下是密码块链接模式的简短说明:

    Chaining 为分组密码添加了反馈机制。块是 首先加密,然后将它们的结果反馈到 下一个块的加密。因此,每个块都会修改加密 下一个区块。

    在 CBC 中,明文首先被加密,结果存储在一个 反馈寄存器。然后下一个明文与内容进行异或 的寄存器。这成为加密的下一个输入 常规。生成的加密存储在反馈寄存器中 再次与下一个明文进行异或。这个过程重复 直到消息结束。对于解密,一个块被解密 通常并存储在反馈寄存器中 - 在下一个块之后 解密后,它与反馈寄存器的结果进行异或运算 以此类推。

    [改编自 Bruce Shneier 的优秀著作,Applied Cryptography]

    【讨论】:

    • @Oddthinking 有许多算法利用前一个加密块(或某个先前值)作为输入来加密下一个块,例如密码块链接模式、密码反馈模式甚至是简单的异或运算。
    • 谢谢,Dhruv。我不怀疑这样的算法可以用递归来实现,但这不是一个经典的递归示例,其中每一步都是比上一步更小、更简单的问题。鉴于流可以连续、无限制地运行,您就有堆栈溢出的风险。
    • @Oddthinking 你是对的,这不是一个经典的递归示例。但这是一个直观的例子。基本情况可以从初始化向量开始,并可以从那里递归。但是,是的,连续流肯定存在堆栈溢出的风险。所以我改变了我的答案以反映某种形式的不确定性。
    【解决方案2】:

    任何类型的循环都可以表示为尾递归,它在函数式语言中很常用。显然,构建/处理任何类型的递归数据结构 - 树是一回事,但例如列表也可以递归表示(因为 head 是元素,tail 是其余的 [另一个列表])。

    【讨论】:

      【解决方案3】:

      任何可以迭代解决的问题都可以递归解决。我会质疑所提问题的有效性,因为迭代或递归解决问题主要取决于具体情况。

      【讨论】:

      • 一般:性能和堆栈深度。具体来说:阶乘函数。或者用非常深的树遍历树。
      猜你喜欢
      • 2020-06-20
      • 2022-11-03
      • 2021-03-22
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 2011-03-15
      • 2012-12-25
      • 2019-10-24
      相关资源
      最近更新 更多