2016-06-16 8 views
0

私は理論的な面でさらに質問があります。 再帰的関数は、すべて(与えられた自然数の異なる除数)を数えます。 数字の再帰的な数え算

理論等F(0)= 0(DEFあたり)、F(3)= 2、F(6)= 4、F(16)= 5との例えば、どのように私ができましたそれを行う?

ありがとうございました。

+0

[指定された数の除数の数を計算するアルゴリズム]の可能な複製(http://stackoverflow.com/questions/110344/algorithm-to-calculate-the-number-of-divisors-ofa-a-与えられた番号) – Idos

+0

私はこの質問が[mathoverflow](http://mathoverflow.net/)または別の数学SEコミュニティに属すると思います。 –

答えて

1

正しく理解すれば、それらを集めるのではなく、集めるだけです。

第2の仮定は、個の独立したの除数(つまり、 "2"、 "3"ではなく "6"でない)を数えたくないということです。

このような場合は、ショーンの答えに示したアルゴリズムを大幅に簡略化することができます。

  1. を、あなたはすぐにあなたが見つけるよう
  2. 、配列divisorListだけカウンタを必要としません分割数で除算した結果、ループの最大限度を減らすことができます(たとえば、ルート番号が900で2が最初の除数である場合は、ループの上限を450に設定できます) 3をチェックすると150までの制限を減らすなど)。

編集:ここでは、もう少し考えた後

が正しいアルゴリズムは次のとおりです。

  1. 数が "N" であると仮定する。次に、カウント2(つまり1とN)で始まります。
  2. Nが2で割り切れるかどうかを確認します。そうでない場合は、カウントに2を追加する必要があります(つまり2とN/2)。
  3. ループの制限をN/2に変更します。
  4. 3で除算するとテストでは整数になります。それがない場合、あなたは数に2を加える(すなわち3およびN/3)と、N/3へ
  5. テスト4 ...
  6. 試験5 ...
  7. ...
  8. を制限を減らします擬似コードで

var Limit = N ; 

Count = 2 ; 

for (I = 2 ; I < Limit ; I++) { 

    if (N/I is integer) { 

     Count = Count + 3 ; 

     Limit = N/I ; 

    } ; 

} ; 

注:私はあなたがプログラミングされている言語がわからないので、あなたの言語を使用すると、ループの制限を変更することを可能にするかどうかを確認する必要があります。表示されない場合は、EXIT-LOOP条件(例:if I >= Limit then exit loop)を含めることができます。

これはあなたの問題を解決します。

+0

例えば6の場合、1,2,3,6を数えたいと思います。関数が私に与える必要があります。4.この場合、答えの2.が働きますか? – vedsil

+1

私は数学的な証明に従事していませんでしたが、推薦する結果に「2」(1の場合は1、もう1つの場合は「n」)を追加するだけです。見てみましょう:例えば10をとります。私の結果は2と5をもたらします。これは2です。あなたは2を4を加えます:6:2、3 = 2、2 = 4 4.私はより高い数字をチェックするためにあなたに残します。これが助けになることを願っています。 – FDavidov

+1

正しい(と非常に単純な)アルゴリズムで自分の答えを編集しました。 – FDavidov

0
public static ArrayList<int> recursiveDivisors(int num) 
{ 
    ArrayList<int> divisorList = new ArrayList<int>(); 

    for (int i = 1; i <= num; i++) 
    { 
     if (num % i == 0) 
      divisorList.add(i) 
    } 
return divisorList; 
} 

これはなんですか? 除数配列リスト内のすべての約数を返します。 EDIT:再帰的ではありません

+0

私は数だけ必要ですが、それほど重要ではありません。しかし、私は再帰的にそれを行う方法を理解することはできません。 – vedsil