不理解递归回溯

时间:2016-10-07 07:22:06

标签: java

我知道这是一个“模糊”的问题,但我在我的大学完成了一个数据结构课程,但仍然不理解递归回溯是如何工作的。我不理解递归的“魔力”,并且很难编写递归回溯算法。比如说我在这里给出一个例子,它是递归回溯的模板:

void findSolutions(n, other params) {
    if (found a solution) {
       solutionsFound++;
       displaySolution();
    if (solutionsFound >= solutionTarget) {
       System.exit(0);
       return;
      }
   }
    for (val = first to last) {
       if (isValid(val, n)) {
           applyValue(val, n);
           findSolutions(n + 1, other params);
           removeValue(val, n);
        }
    }
} 

我不明白这实际上是如何运作的。我有点厌倦让别人告诉我,我必须相信它。我真的想深入解释递归实际如何工作以及如何编写它。 我相信递归是理解技术访谈的一个重要概念,我真的希望能够在需要解决这些问题时编写代码。任何提示都将非常感谢您解释这一点以及查看和学习的良好资源。

1 个答案:

答案 0 :(得分:0)

递归的简单示例。

假设你想要一个方法sum(n),它将0n的数字相加。

使用简单的for循环,这很容易理解:

private static int sum(int n) {
    int sum = 0;
    for (int i = 0; i <= n; i++)
        sum += i;
    return sum;
}
System.out.println(sum(5)); // prints: 15

现在,如果你使用递归来做这件事,会有两种方法。

一种方法是添加第二个参数,其中包含到目前为止计算的总和,最初设置为0,然后像这样进行递归调用:

private static int sum(int n, int sum) {
    if (n == 0)
        return sum;
    return sum(n - 1, sum + n);
}
System.out.println(sum(5, 0)); // prints: 15

这称为尾递归,因为递归调用是在方法中完成的最后事情。这是functional programming中的常见模式。

另一种方法是使用递归回溯,这就是你所问的。

在此进行递归调用以计算sum(n-1),直至到达sum(0),这当然是0。然后,您将n添加到该总和并返回它。

private static int sum(int n) {
    if (n == 0)
        return 0;
    return sum(n - 1) + n;
}
System.out.println(sum(5)); // prints: 15

这是使用回溯,因为它首先进行递归调用 ,计算“较低”值,然后在从较低调用返回时添加到该值,即回溯时。