Java Notes] 第 5 章:函数 - 6.第 5 章:函数 - 6.函数的递归调用
最编程
2024-05-04 22:41:14
...
【理解】一个函数调用自身。
【注意】函数递归使用过程中,必须设置一个出口,否则可能会出现无穷递归,运行过程中报错。报错信息为:java.lang.*Error(栈溢出)。
【递归的思想】
- 递进:每一次推进,计算都比上一次变得简单,直至简单到无需继续推进,就能获得结果。也叫到达出口。
- 回归:基于出口的结果,逐层向上回归,依次计算每一层的结果,直至回归到最顶层。
【示例】
package demo;
public class Test{
public static void main(String[]args){ // 135642
int r = jieCheng(8);
System.out.println(r);
}
// 函数功能:计算 n的阶乘
public static int jieCheng(int n){
// 递归的出口
if(n==1 || n==0) return 1;// n的阶乘 = n* (n-1)的阶乘
return n* jieCheng(n-1);
}
}
推荐阅读
-
Java Notes] 第 5 章:函数 - 6.第 5 章:函数 - 6.函数的递归调用
-
《【算法导论】动态规划在矩阵链乘法中的应用》 #include
void printParentheses(int s[6][6], int i, int j); // 打印加括号的位置 void matrixOrder(int* p, int n, int m[6][6], int s[6][6]); // 计算最佳加括号的方式 int main() { int p[7] = {30, 35, 15, 5, 10, 20, 25}; // 记录6个矩阵的行和列,注意相邻矩阵的行和列是相同的 int m[6][6] = {0}; // 存储第i个矩阵到第j个矩阵的计算代价(以乘法次数来表示) int s[6][6] = {0}; // 存储第i个矩阵到第j个矩阵的最小代价时的分为两部分的位置 int n = 6; // 矩阵个数 matrixOrder(p, n, m, s); printf("最终加括号的形式为:\n"); // 输出加括号的位置 printParentheses(s, 0, 5); return 0; } /****************************************************\ 函数功能:计算最佳的加括号的方式,得到m和s矩阵 输入: 矩阵的行和列p, 初始化的m和s矩阵 输出: 无 \****************************************************/ void matrixOrder(int* p, int n, int m[6][6], int s[6][6]) { int q = 0; int j = 0; for (int i = 0; i < n; i++) m[i][i] = 0; for (int l = 2; l <= n; l++) for (int i = 0; i < n - l + 1; i++) { j = i + l - 1; m[i][j] = 1000000; for (int k = i; k < j; k++) // 在i,j中遍历每一个分割的位置 { q = m[i][k] + m[k + 1][j] + p[i] * p[k + 1] * p[j + 1]; // 计算代价 if (q < m[i][j]) { m[i][j] = q; s[i][j] = k; } } } } /****************************************************\ 函数功能:打印加括号的位置 输入: s矩阵,想要计算的矩阵链的起始和结尾位置 输出: 无 \****************************************************/ void printParentheses(int s[6][6], int i, int j) { if (i == j) printf("A%d", i); else { printf("("); printParentheses(s, i, s[i][j]); printParentheses(s, s[i][j] + 1, j); // 递归调用 printf(")"); } }