代码之家  ›  专栏  ›  技术社区  ›  Nime

生成递归和结构递归之间有什么区别?

  •  2
  • Nime  · 技术社区  · 7 年前

    Racket中的生成递归和结构递归有什么区别?

    1 回复  |  直到 7 年前
        1
  •  2
  •   Alex Knauth    7 年前

    当“子问题”与可能的数据片段完全匹配时,就会发生结构递归。

    例如,处理列表 lox . 最常见的情况是 氧合酶 为空。否则,第一个子问题是处理 (first lox) ,第二个子问题是处理 (rest lox) . 您可以通过调用辅助函数来解决每个子问题,并将解决方案组合在一起。

    (define (process-list-of-x lox)
      (cond
        ;; trivial case
        [(empty? lox) ...]
        [(cons? lox)
         ; combine the solutions
         (...
          ; solve the first sub-problem
          (process-x (first lox))         ; data-def tells you what the first sub-problem is
          ...
          ; solve the second sub-problem
          (process-list-of-x (rest lox))  ; data-def tells you what the second sub-problem is
          ...)]))
    

    不同的是,结构递归告诉你子问题是什么,在生成递归中,子问题可以是任何东西。你经常需要一个新的想法来打破它。针对问题而非数据的尤里卡时刻。

    (define (solve-problem prob)
      (cond
        ;; trivial case
        [(trival-problem? prob) (... prob ...)]
        [else
         ; combine the solutions
         (...
          ; solve the first sub-problem
          (solve-problem (generate-first-sub-problem prob))   ; you have to figure this out
          ...
          ; solve the second sub-problem
          (solve-problem (generate-second-sub-problem prob))  ; data-def doesn't tell you how
          ...)]))
    

    此外,结构递归保证它终止,因为子问题来自分解数据。在生成递归中,子问题可能更复杂,因此需要一些其他方法来确定它是否终止。