[英]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.