递归与辗转相除法
- 递归(Recursion)
- 辗转相除法(Euclidean Algorithm)
- 总结
递归(Recursion)
递归是指一个函数在执行过程中调用自身的过程。在编程中,递归函数在遇到满足某个条件时会停止调用自身,从而结束递归。递归经常用于解决可分解为相似但规模较小的子问题的问题。在递归的每一层,问题都会变得更小,直到达到基本情况(终止条件),然后逐层返回结果。
递归的经典示例是计算阶乘。阶乘表示从1到给定的数字的乘积。例如,5的阶乘是1 * 2 * 3 * 4 * 5 = 120。这可以通过递归函数来计算:
public static int factorial(int n) {
if (n == 0) {
return 1; // 基本情况:0的阶乘为1
} else {
return n * factorial(n - 1); // 递归调用:n的阶乘为n乘以(n-1)的阶乘
}
}
递归函数必须具有终止条件,否则它将永远递归下去,导致栈溢出。
辗转相除法(Euclidean Algorithm)
辗转相除法,也称为欧几里德算法,是一种用于计算两个整数的最大公约数(GCD)的算法。最大公约数是能够整除两个数的最大正整数。
辗转相除法的基本思想是:假设a和b是两个整数,其中a > b。我们用a除以b,得到商q和余数r,即a = bq + r。那么a和b的最大公约数等于b和r的最大公约数。
下面是辗转相除法的基本算法:
如果b等于0,则a就是最大公约数。
否则,我们将a赋值给b,将r赋值给a,然后重复步骤1,直到b等于0为止。
下面是一个用Java实现的简单例子:
public static int findGCD(int a, int b) {
if (b == 0) {
return a; // 基本情况:b等于0,a就是最大公约数
} else {
return findGCD(b, a % b); // 递归调用:继续求b和a除以b的余数的最大公约数
}
}
这个方法会一直递归调用直到b等于0,这时a就是最大公约数。
总结
递归是一种函数调用自身的编程技术,用于解决问题,其中问题被分解为规模较小的子问题。
辗转相除法是一种用于计算两个整数的最大公约数的数学算法,它基于整数除法和取余运算。