2017-10-13 21 views
0

再帰関数の使い方を理解しようとしていますが、なぜこの関数が間違っているのか分かりません。私は基本事例2にあると信じていますが、理由はわかりません。再帰素数関数C++

#include <iostream> 
using namespace std; 

// Returns 0 if value is not prime, 1 if value is prime 
int IsPrime(int testVal, int divVal) 
{ 
    // Base case 1: 0 and 1 are not prime, testVal is not prime 
    if(testVal == 0 || testVal == 1){ 
     return 0; 
    } 
    // Base case 2: testVal only divisible by 1, testVal is prime 
    if(testVal/1 == testVal){ 
     return 1; 
    } 
    // Recursive Case 
     // Check if testVal can be evenly divided by divVal 
     // Hint: use the % operator 
     if(testVal % divVal != 1){ 
     IsPrime(testVal, divVal); 
     } 
     // If not, recursive call to isPrime with testVal and (divVal - 1) 
    return 0; 
} 

int main(){ 
    int primeCheckVal = 0; // Value checked for prime 

    // Check primes for values 1 to 10 
    for (primeCheckVal = 1; primeCheckVal <= 10; ++primeCheckVal) { 
     if (IsPrime(primeCheckVal, (primeCheckVal - 1)) == 1) { 
     cout << primeCheckVal << " is prime." << endl; 
     } 
     else { 
     cout << primeCheckVal << " is not prime." << endl; 
     } 
    } 
} 
+3

if(testVal/1 == testVal)で達成しようとしていることは本当に明確ではありません。 – Steve

+2

デバッガを使用してコードをステップ実行する方法を学ぶ必要があるようです。良いデバッガを使用すると、プログラムを1行ずつ実行し、どこからずれているかを確認することができます。これはプログラミングをする場合に不可欠なツールです。さらに読む:[小さなプログラムをデバッグする方法](http://ericlippert.com/2014/03/05/how-to-debug-small-programs/) 'testVal'や' divVal'を決して変更しないでください。 – NathanOliver

答えて

0

testVal/1 == testValので、おそらくあなたは(数は一つだけ割り切れるかどうかをチェックする)期待して何をしていません(あなたが無限大またはNaNをのような奇妙なもので遊んでいない提供)真常にです - プライム7と複合体15で試してみてください。

したがって、関数に渡された0以外の数は、誤って素数として検出されます。

数字が1で割り切れるかどうかを確認するには、他の候補値で割り切れないことを確認する必要があります。一例(擬似コード)によって:余談として

def isPrime(n): 
    testVal = 2 
    while testVal * testVal <= n: 
     if int (n/testVal) * testVal == n: 
      return false 
    return true 

、Iは、試験した素数が再帰溶液に適していることを完全に確信していません。あなたは、非再帰的な解(目的が素数を検出することである場合)または別の問題(あなたの目的が再帰を知ることである場合)を見たいかもしれません。