在Java中使用递归查找数字的以2为底的对数

问题描述

我正在尝试用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;
            
        }
    }

在第一次调用期间,数字等于temp,所以我使用一个step变量来防止终止条件的执行。如果我在递归调用中不使用“ 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))一致,请使用以下变体:

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()
    }
}   

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...