我的課程中有一個任務是撰寫一個函式來檢查一個數字是否為素數,如果是則回傳 1,如果不是則回傳 0,所有這些都以遞回方式完成。函式看起來像這樣:int isPrime(int num); 我已經嘗試了所有方法并到處搜索,得出的結論是只有使用我尚未學習的靜態 int 才能使用它,因此不能使用它或使用兩個引數。有誰知道是否有一種方法可以只用一個引數而不是靜態 int 來解決它?謝謝。
uj5u.com熱心網友回復:
這是一個棘手的問題:您應該使用遞回,但除非您被禁止使用回圈,否則可以使用回圈的經典解決方案for來滿足遞回要求。
這是一個isPrime具有單個引數并使用經典回圈和遞回來測驗素數除數的函式:
int isPrime(int n) {
if (n <= 1)
return 0;
if (n % 2 == 0)
return n == 2;
for (int p = 3; p * p <= n; p = 2) {
if (isPrime(p) && n % p == 0)
return 0;
}
return 1;
}
上面的代碼只對素數除數執行模運算。p這是一種錯誤的優化,因為通過遞回呼叫確定是否為素數實際上比計算更昂貴n % p。
uj5u.com熱心網友回復:
所以這是我對這個有問題的任務的解決方案。它僅包含采用一個 int 引數并使用遞回且無回圈的函式:
#include <iostream>
#include <functional>
std::function<bool(int)> isPrime(int x) {
return [x](int p) {
if (x <= 2) return true;
return (p % (x - 1) != 0) && (isPrime(x - 1)(p));
};
}
int main() {
if (isPrime(19)(19)) std::cout << "is prime" << std::endl;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/479232.html
上一篇:Memory Error
下一篇:如何存盤函式的第二個回傳值?
