在此示例中,此递归如何工作?

时间:2019-07-15 11:51:29

标签: recursion eggdrop

这是经典的鸡蛋掉落问题。我只是不知道递归在这里如何工作。如何到达每次递归都返回min + 1的函数的结尾?

请注意,我对递归的概念性理解可能存在缺陷。

/* Function to get minimum number of trials needed in worst 
case with n eggs and k floors */
int eggDrop(int n, int k) 
{ 
// If there are no floors, then no trials needed. OR if there is 
// one floor, one trial needed. 
if (k == 1 || k == 0) 
    return k; 

// We need k trials for one egg and k floors 
if (n == 1) 
    return k; 

int min = INT_MAX, x, res; 

// Consider all droppings from 1st floor to kth floor and 
// return the minimum of these values plus 1. 
for (x = 1; x <= k; x++) 
{ 
    res = max(eggDrop(n-1, x-1), eggDrop(n, k-x)); 
    if (res < min) 
        min = res; 
} 

return min + 1; 
}

1 个答案:

答案 0 :(得分:0)

n == 1k == 0k == 1时,递归有几种基本情况。

每个非基本情况调用都有很多递归调用。因此,例如,如果我们要调用eggDrop(2, 5),我们将返回类似值

min (
  // **egg breaks**  **egg doesn't break**
  max (eggDrop (1, 0), eggDrop (2, 4) ),
  max (eggDrop (1, 1), eggDrop (2, 3) ),
  max (eggDrop (1, 2), eggDrop (2, 2) ),
  max (eggDrop (1, 3), eggDrop (2, 1) ),
  max (eggDrop (1, 4), eggDrop (2, 0) ),
)

请注意,这些案例中的每一个都将我们推向这些基本案例之一。在第一列中,我们将n减少了1,在第二列中,我们将k减少了x, 其中x是一个不大于k的正整数。而且由于每次递归调用都会使我们更接近基本情况,所以我们最终将触底反弹。

(您可以通过显示每次递归调用n + k严格小于其父调用来正式证明这一点。在这里,我不会打扰;直觉应该足够。)

那应该解释递归实际上是如何工作的。

但是请注意我们正在进行多少次递归调用:k * (k - 1) / 2。这意味着此递归版本不太可能是非常有效的解决方案。因此,通常可以通过动态编程技术解决此问题。