iterate and recursion
迭代
迭代本质就是调用循环,直至满足某个条件
递归
函数直接或者间接的调用自己的情况
缺点:
- 递归可能会导致大量的函数调用栈
java
public class Factorial {
public static int factorial(int n) {
if (n == 0 || n == 1) { // 基准情况
return 1;
} else {
return n * factorial(n - 1); // 递归情况
}
}
public static void main(String[] args) {
System.out.println(factorial(5)); // 输出: 120
}
}
尾递归
函数的返回值直接是递归调用的结果,递归调用是函数执行的最后一步
python
def factorial(n):
if n == 0 or n == 1:
return 1
else:
return n * factorial(n - 1) # 递归调用不是最后的操作,因为它之后还有乘法操作
python
def factorial(n, accumulator=1):
if n == 0 or n == 1:
return accumulator
else:
return factorial(n - 1, n * accumulator) # 递归调用是最后的操作
回溯
通过试错来寻找问题的解决方案,需要遍历所有的候选结果
回溯通常是在递归的基础上进行状态的回退。比如在选择一个数字后,进入下一层递归,当递归返回时,需要撤销当前的选择,以便尝试其他可能的选项。
剪枝是回溯算法中优化效率的关键步骤。比如在组合问题中,当剩余的数字不足以凑成所需的组合大小时,可以提前终止当前路径的搜索,减少不必要的递归
核心思想
- 试探性选择:逐步构建候选解,每一步选择一个可能的选项。
- 约束检查:若当前选择满足所有约束条件,则继续递归构建下一步。
- 回退:若当前选择导致后续无法满足条件,则撤销该选择(回溯),回到上一步尝试其他选项。