簡體   English   中英

創建遞歸 static 方法來查找數組中素數的乘積

[英]Creating recursive static method to find product of prime numbers in array

盡管 if(number % j == 0) 在 9/3 時返回 true 並且沒有余數但為 0,但數字 9 一直從我的 Prime 方法返回 true。有人願意幫助我嗎? 我也試圖不使用 for 循環。 這是為了家庭作業。

編輯:我已經嘗試了下面的答案,但我仍然使用 if 語句遇到同樣的問題。

public class test {
    private static int product = 1;
    private static int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    private static boolean allowmultiply;
    public static void main(String args[]) {
        System.out.println("Product: " + findproduct(array, 0));
        }

    public static int findproduct(int[] list, int i) {
        int[] temp = list;
         if(i <= temp.length-1) {
            allowmultiply = Prime(temp[i], 2);
            if(allowmultiply != false) {
                product = product * temp[i];
            } 
            i++; 
            return findproduct(temp, i);
        }
        return product;
    }
    public static boolean Prime(int number, int j) {
        if(j <= number/j) {
            if(number % j == 0) {
                return false;
            }
            Prime(number, j+1);
        }
        return true;
    }
}

新代碼:感謝 WJS 的幫助!

public class ProductPrimeNumber {
        private static int product = 1;
        private static boolean allowmultiply;
        private static int checker = 0;
        private static int[] array = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

    public static void main(String args[]) {
        System.out.println("Product: " + findproduct(array, 0));
        }
    public static int findproduct(int[] list, int i) {
        int[] array = list;
        if(i <= array.length-1) {
            allowmultiply = isPrime(array[i], 2);
            if(allowmultiply != false) {
                product = product * array[i];
            } 
            checker = 0;
            i++;
            return findproduct(array , i);
        }
        return product;
    }
    public static boolean isPrime(int number, int i) {
        if(i < number) {
            if(number % i == 0 && i != number) {
                checker++;
            }
            isPrime(number, i+1);
        }
        if(checker > 0) {
            return false;
        }
        return true;
    }
}

這可能會有所幫助。 暫時忘掉素數,因為那是一個完全獨立的問題。 考慮偶數的乘積。 該方法並不像幫助清晰度那樣緊湊。

static Predicate<Integer> isEven = a -> a != 0 && a % 2 == 0;

int[] data = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
int prod = findProduct(data, 0);
System.out.println("prod = " + prod);

印刷

prod = 3840
  • 定義一個 lambda 來測試偶校驗和 >.= 0。這不是必需的,但有助於解釋。
  • 然后用數組和 0 開始調用方法。
  • 繼續調用該方法,直到i == v.length-1 (最后一個元素)。
  • 然后通過首先測試v[i]的偶校驗來"unwind"遞歸調用
  • 如果為真,則返回prod * v[i]
  • 否則,只返回prod
public static int findProduct(int[] v, int i) {
    int prod = 1;
    if (i < v.length-1) { 
       prod = findProduct(v, i+1);
    }
    if (isEven.test(v[i])) {
        return prod * v[i];
    }
    return prod;
}

這個和主要解決方案之間的唯一區別是您的測試目的。 所以用isEven替換isPrime 然后你只需要專注於你的isPrime代碼。

更緊湊的findProduct版本在這里。

  • 簡單地測試偶數奇偶校驗
  • 乘以 v[i] 或 1 的返回乘積
  • i == i.length時,返回1開始展開過程
public static int prodEven(int[] v, int i) {
    if (i < v.length) { 
        return (isEven.test(v[i]) ? v[i] : 1) * prodEven(v, i+1);
    }
    return 1;
}

要通過遞歸完成,您可以從一個索引開始(比如 i 指向數組的開頭)。

基本條件:當i達到數組長度時,則返回1;

要做的工作:如果數字是素數,則將其乘以乘積和調用其他函數的返回值,如果不是,則將乘積乘以調用其他函數的返回值。

public class PrimeProduct {
    static int product = 1;

    public static void main(String[] args) {
        int list[] = { 3, 5, 9, 11 }; // 11*5*3
        int res = findProduct(list, 0);
        System.out.println(res);
    }

    public static int findProduct(int[] list, int i) {
        if (i == list.length) {
            return 1;
        }
        return isPrime(list[i], 2) ? product * list[i] * findProduct(list, i + 1) : product * findProduct(list, i + 1);

    }

    private static boolean isPrime(int num, int i) {
        if (i * i > num) {
            return true;
        }

        return (num % i != 0) ? isPrime(num, i + 1) : false;

    }

}

output 是

165

暫無
暫無

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

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