java - 将 Log2 Iterativ 转为 Recursiv 方式
问题描述
我想到了一个简单的任务,它以迭代方式计算 Log2,例如:
public static int log2(int x) {
int result = 0;
while (x > 1) {
x = x / 2;
result++;
}
return result;
}
现在我想把它变成一个递归函数,但我认为我把它复杂化了。
像这样结束:
public static int recLog2(int x) {
if (x < 1) {
return x;
} else {
return recLog2(x/2);
}
}
问题是我走得太远了,我不知道如何解决它。
例子:
log2(13) -> 3
reclog2(13) -> 1
解决方案
您忘记了在每个递归级别累积值。粗略的解决方案(我没有检查它是否存在错误)可能是:
if (x < 1) {
return 0;
} else {
return 1 + recLog2(x/2);
}
似乎是学习示例,所以我将最终解决方案留给了您。如果是出于实际目的,我建议使用基于 Java 方法构建的表达式,Integer.numberOfTrailingZeros(Integer.highestOneBit(x))
这样更简洁高效。
推荐阅读
- macos - 每次都使用相同的 shell 脚本文件
- c# - 使用 C# 和 Flurl 到 Joplin REST API 的多部分 POST
- c - 为什么我可以从 int**(作为二维数组)转换为 int*?
- unity3d - Unity 使用 PS4 控制器旋转对象
- javascript - 如何使用 Nodejs 加载和解析 6M+ 行的 300MB CSV 文件?
- bash - 我不小心使用 macbook 上的 .bash_profile 错误地设置了路径环境变量。我该如何重置它?
- excel - XSLT - 解析日期和时间
- html - jquery ReplaceWith 不能使用 2 个按钮
- reactjs - nginx 服务的反应应用程序中 js 包的路径无效
- python - ModuleNotFoundError:没有名为“pip”python3的模块