用java中的递归法求一个数的以2为底的对数

f4t66c6m  于 2021-07-06  发布在  Java
关注(0)|答案(2)|浏览(495)

我正在尝试用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变量来阻止终止条件的执行。如果在递归调用中不使用“number”变量,我没有办法累加上一个乘积,但是number变量已经等于temp,并且将在下一个递归调用中触发终止条件,因此总是给出输出1。
我能做些什么使这个程序工作?

js81xvg6

js81xvg61#

第一个版本(reducting)的固定终止值为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;
}

这种模式——使用 Package 器函数——在递归的初始状态需要设置一次的情况下很常见,但我们不想让调用方知道什么是实现选择。
您的第一个方法也可以编码为一行:

static int log(int number) {
    return number == 1 ? 0 log(number/2) + 1;
}
6tr1vspr

6tr1vspr2#

试试这个:

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

相关问题