递归计算数字的除数

时间:2016-06-16 12:49:20

标签: function

我有一个问题,更多的是理论方面。我想创建一个递归函数,该函数计算给定自然数的所有(不仅仅是素数)不同的除数。

例如,f(0)= 0(每个Def。),f(3)= 2,f(6)= 4,f(16)= 5等。

理论上,我怎么能这样做?

感谢。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,你只想计算它们,而不是收集它们,对吗?

第二个假设是你不想只计算独立的除数(即你要计算" 2"," 3"但不是" 6")。

如果是这种情况,Sean的答案中显示的算法可以大大简化:

  1. 您不需要数组divisorList,只需要一个计数器,
  2. 你发现除数后,你可以通过将除数除以除数来减少循环的最大限制(例如,如果你的根数是900,2是第一个除数,你可以设置循环的限制为450;然后,当检查3时,您将限制减少到150,依此类推。)
  3. 编辑:

    在考虑了一点之后,这是正确的算法:

    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)。

      希望这可以解决您的问题。

答案 1 :(得分: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;
}

这样的东西? 返回除数数组列表中的所有除数 编辑:不递归