我知道这是一个“模糊”的问题,但我在我的大学完成了一个数据结构课程,但仍然不理解递归回溯是如何工作的。我不理解递归的“魔力”,并且很难编写递归回溯算法。比如说我在这里给出一个例子,它是递归回溯的模板:
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);
}
}
}
我不明白这实际上是如何运作的。我有点厌倦让别人告诉我,我必须相信它。我真的想深入解释递归实际如何工作以及如何编写它。 我相信递归是理解技术访谈的一个重要概念,我真的希望能够在需要解决这些问题时编写代码。任何提示都将非常感谢您解释这一点以及查看和学习的良好资源。
答案 0 :(得分:0)
递归的简单示例。
假设你想要一个方法sum(n)
,它将0
到n
的数字相加。
使用简单的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
这是使用回溯,因为它首先进行递归调用 ,计算“较低”值,然后在从较低调用返回时添加到该值,即回溯时。