java - 这个程序中究竟发生了什么,特别是在 return 语句中?
问题描述
实际操作是在行返回中进行的
return (num == 1 ? 1 : num * firstFactorial(num - 1 ) );
我们如何为 num 8获得40320?
public class Factorial {
public static int firstFactorial(int num) {
return (num == 1 ? 1 : num * firstFactorial(num - 1 ) );
}
public static void main(String[] args) {
System.out.println(firstFactorial(8));
}
}
解决方案
该 return 语句中发生了多件事。可以像这样重写firstFactorial
函数:
public static int firstFactorial(int num) {
if (num == 1) {
return 1;
}
int decreased = num - 1;
int recursiveFactorial = firstFactorial(decreased);
int result = num * recursiveFactorial;
return result;
}
首先,这是使用一种称为递归的技术。该函数正在调用自身,其中 number 参数减一。你可以这样想:
1. You call firstFactorial with value of 8
2. firstFactorial(8) calls itself with a value of 7
3. firstFactorial(7) calls itself with a value of 6
...
8. firstFactorial(2) calls itself with a value of 1
9. firstFactorial(1) returns 1 because of the if-statement
在调用自身后,函数将递归调用的返回值乘以它自己的参数并返回它。所以它会像这样继续:
10. firstFactorial(2) multiplies 1 with 2 and returns 2
11. firstFactorial(3) multiplies 2 with 3 and returns 6
10. firstFactorial(4) multiplies 6 with 4 and returns 24
...
14. firstFactorial(8) multiplies 5040 with 8 and returns 40320 to you
总之,这将计算出这样的值的能力:8 * 7 * 6 * ... * 1
其余的或多或少是编码风格和语法糖。您不需要局部变量并在一行中执行调用和操作:
public static int firstFactorial(int num) {
if (num == 1) {
return 1;
}
return num * firstFactorial(num -1);
}
然后是 java ( <cond> ? <true statement> : <false statement>
) 中的三元条件运算符,它允许您在一行中表达整个函数体:
public static int firstFactorial(int num) {
if (num == 1) {
return 1;
}
return (num == 1) ? 1 : (num * firstFactorial(num -1));
}
推荐阅读
- asp.net-core - SignalR 集线器在 ASP.NET Core 的 RabbitMQ 订阅处理程序中解析为 null
- javascript - 从 objectstore 获取项目在 HTML 中返回 [object Object]
- flutter - 如何处理“Android 许可证状态未知”。
- python - 如何使用 python-docx 在 MS word 中添加页间链接?
- java - 如何以“yyyy/MM/dd HH:mm:ss”格式格式化给定日期“31.12.9999”
- javascript - 随机数生成器不会使用输入字段中的值生成给定范围内的预期数字
- android - 如何让我的应用程序始终保持领先,优先于其他应用程序?
- angular - 使用 --prod 进行 Angular 控制台日志记录
- vim - 如何知道在vim中进行特定操作时会触发哪些事件?
- python - 使用 azure cli 进行部署,同步触发器.. 超时