在 java 中使用递归求一个数的以 2 为底的对数
Finding the Base 2 Logarithm of a number using Recursion in java
我正在尝试在 Java 中编写一个递归方法来查找 2 的倍数的基数 2 对数。
我已经使用这种递归方法成功计算了日志。
import java.util.*;
class temp
{
static int log(int number)
{
if(number==1)
return 0;
return log(number/2)+1;
}
public static void main(String s[])
{
Scanner input=new Scanner(System.in);
System.out.println("Enter Multiple of 2:");
System.out.println("Log is:"+log(input.nextInt())); //calling log with return value of nextInt()
}
}
我 运行 搁浅的地方是尝试使用不同的方法实现相同的程序,在这种方法中,我开始在递归调用中从 2 开始乘以直到它等于给定的数字。这是我尝试过的:
class logarithmrecursion
{
static int step=1;
static int log(int number)
{
final int temp=number;
if(number>=temp && step!=1)
return 0;
step++;
return log(number*2)+1;
}
}
在第一次调用时,number 等于 temp,所以我使用一个 step 变量来防止终止的执行 condition.If我不在递归调用中使用“number”变量,我不没有办法累加之前的乘积,但是 number 变量已经等于 temp 并且会在下一次递归调用中触发终止条件,因此总是输出 1.
我该怎么做才能使这个程序运行?
第一个缩减版本的固定终止值为 1。
但是第二个版本的终止取决于数字,因此您必须将其传递到递归调用中。所以,你的主函数调用了一个私有递归版本:
static int log(int number) {
return log(number, 1);
}
private static int log(int number, int current) {
return current < number ? log(number, current * 2) + 1 : 0;
}
注意:您的算法将值向上舍入。要给出与 (int)(Math.log(i) / Math.log(2))
一致的(更符合预期的)舍入 down 结果,请使用此变体:
private static int log(int number, int current) {
return current <= number / 2 ? log(number, current * 2) + 1 : 0;
}
这种模式 - 使用包装函数 - 在递归的初始状态需要设置一次的情况下很常见,但我们不想让调用者负担必须知道什么是实现选择。
您的第一个方法也可以编码为一行:
static int log(int number) {
return number == 1 ? 0 log(number/2) + 1;
}
试试这个:
import java.util.Scanner;
public class LogTest
{
static int calLog(final int number)
{
if(number < 2) {
return 0;
}
return log(number, 2, 1);
}
static int log(final int number, final int accumulated, final int step)
{
if(accumulated >= number) {
return step;
}
return log(number, accumulated * 2, step+1);
}
public static void main(String s[])
{
Scanner input=new Scanner(System.in);
System.out.println("Enter Multiple of 2:");
System.out.println("Log is:"+calLog(input.nextInt())); //calling log with return value of nextInt()
}
}
我正在尝试在 Java 中编写一个递归方法来查找 2 的倍数的基数 2 对数。
我已经使用这种递归方法成功计算了日志。
import java.util.*;
class temp
{
static int log(int number)
{
if(number==1)
return 0;
return log(number/2)+1;
}
public static void main(String s[])
{
Scanner input=new Scanner(System.in);
System.out.println("Enter Multiple of 2:");
System.out.println("Log is:"+log(input.nextInt())); //calling log with return value of nextInt()
}
}
我 运行 搁浅的地方是尝试使用不同的方法实现相同的程序,在这种方法中,我开始在递归调用中从 2 开始乘以直到它等于给定的数字。这是我尝试过的:
class logarithmrecursion
{
static int step=1;
static int log(int number)
{
final int temp=number;
if(number>=temp && step!=1)
return 0;
step++;
return log(number*2)+1;
}
}
在第一次调用时,number 等于 temp,所以我使用一个 step 变量来防止终止的执行 condition.If我不在递归调用中使用“number”变量,我不没有办法累加之前的乘积,但是 number 变量已经等于 temp 并且会在下一次递归调用中触发终止条件,因此总是输出 1.
我该怎么做才能使这个程序运行?
第一个缩减版本的固定终止值为 1。
但是第二个版本的终止取决于数字,因此您必须将其传递到递归调用中。所以,你的主函数调用了一个私有递归版本:
static int log(int number) {
return log(number, 1);
}
private static int log(int number, int current) {
return current < number ? log(number, current * 2) + 1 : 0;
}
注意:您的算法将值向上舍入。要给出与 (int)(Math.log(i) / Math.log(2))
一致的(更符合预期的)舍入 down 结果,请使用此变体:
private static int log(int number, int current) {
return current <= number / 2 ? log(number, current * 2) + 1 : 0;
}
这种模式 - 使用包装函数 - 在递归的初始状态需要设置一次的情况下很常见,但我们不想让调用者负担必须知道什么是实现选择。
您的第一个方法也可以编码为一行:
static int log(int number) {
return number == 1 ? 0 log(number/2) + 1;
}
试试这个:
import java.util.Scanner;
public class LogTest
{
static int calLog(final int number)
{
if(number < 2) {
return 0;
}
return log(number, 2, 1);
}
static int log(final int number, final int accumulated, final int step)
{
if(accumulated >= number) {
return step;
}
return log(number, accumulated * 2, step+1);
}
public static void main(String s[])
{
Scanner input=new Scanner(System.in);
System.out.println("Enter Multiple of 2:");
System.out.println("Log is:"+calLog(input.nextInt())); //calling log with return value of nextInt()
}
}