簡體   English   中英

在 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 變量來防止執行終止條件。如果我在遞歸調用中不使用“number”變量,我沒有辦法累積以前的產品但數字變量已經等於 temp 並且將在下一次遞歸調用中觸發終止條件,因此總是給 output 1。

我能做些什么來使這個程序工作?

第一個是減少版本,其終止值固定為 1。

但是第二個版本的終止取決於數字,所以你必須將它傳遞給遞歸調用。 因此,您的主要 function 調用私有遞歸版本:

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;
}

這種模式 - 使用包裝器 function - 在遞歸的初始 state 需要設置一次的情況下很常見,但我們不想讓調用者承擔必須知道什么是實現選擇的負擔。


您的第一種方法也可以編碼為一行:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM