递归方法中包含/排除当前元素背后的逻辑

时间:2018-12-30 12:58:50

标签: algorithm recursion dynamic-programming

我现在正在研究DP,但是我之前碰到过一些示例,例如子集总和或此问题中显示的硬币更改问题,它们的解决方案称为递归案例 ,均包括当前元素,但不包括当前元素 。但是,通过这种方法,我确实很难理解什么/为什么是真正的原因。我无法理解其背后的逻辑。我不想记住或说“哼,好吧,请记住,有一种方法”

enter image description here

malloc

我不想从表面上跳过这些部分,因为递归公式在动态编程中确实起着主导作用。

1 个答案:

答案 0 :(得分:1)

在每次递归中,您都希望探索两种情况:

  1. 又使用了一种n型硬币
  2. 您已经完成了硬币类型n的操作,然后继续下一个硬币类型

在两种情况下,其余任务都通过递归调用来处理。

顺便说一下,该解决方案与动态编程无关。


在常见的幂集问题中,给定(1 2 3),要求我们生成((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) ())。我们可以使用 with without 技术来生成结果。

+---+         +---------------------------+     +--------------------------------------------+
|   +-with----> ((1 2 3) (1 2) (1 3) (1)) |     |                                            |
| 1 |         |                           +-----> ((1 2 3) (1 2) (1 3) (1) (2 3) (2) (3) ()) |
|   +-without-> ((2 3) (2) (3) ())        |     |                                            |
+-^-+         +---------------------------+     +--------------------------------------------+
  |
  +-------------------------------------------+
                                              |
+---+           +-------------+   +-----------+--------+
|   +-with------> ((2 3) (2)) |   |                    |
| 2 |           |             +---> ((2 3) (2) (3) ()) |
|   +-without---> ((3) ())    |   |                    |
+-^-+           +-------------+   +--------------------+
  |
  +--------------------------------+
                                   |
+---+           +-----+     +------+--------+
|   +-with------> (3) |     |               |
| 3 |           |     +----->  ((3) ())     |
|   +-without---> ()  |     |               |
+-^-+           +-----+     +---------------+
  |
  |
+-+-+
|() |
|   | <- base case
+---+