如何将这个迭代语句转换成递归语句?

t40tm48m  于 2021-07-04  发布在  Java
关注(0)|答案(3)|浏览(289)

所以我有一个编程项目,我需要创建一个程序来确定一个数字是否是一个完美的正方形,如果是,把它写进一个.txt文档。对于for循环来说,这是非常容易和有效的,然而,赋值的指令说程序应该使用递归来完成这一点。这是我提出的迭代语句:

double division;
        for (int i = 0; i < inputs.size(); i++) {
            division = (Math.sqrt(inputs.get(i)));
            if (division == (int)division) {
                pw.println(inputs.get(i));
                 }
            }

哪里 inputs 是通过读取用户的输入创建的arraylist。这解决了问题,但正如我所说,它需要是一个递归语句。我知道对于递归,我需要一个基本情况,它最终会使方法停止调用自己,但我不知道基本情况是什么。另外,我也看到了几个从迭代到递归的转换示例,但是所有这些示例都使用一个 int 变量,在我的例子中,我需要用一个arraylist。任何帮助都将不胜感激

nbysray5

nbysray51#

您可以递归地检查任何较小int的平方是否等于您的输入。

public static boolean isSquare(int n) {
  if (n==0 || n==1) return true;
  return isSquare(n, 1);
}

private static boolean isSquare(int n, int i) {
  if (i*i == n) return true;
  if (i*i > n) return false;
  return isSquare(n,i+1);
}
snvhrwxg

snvhrwxg2#

对于递归函数,可以使用二进制搜索算法:

int checkPerfectSquare(long N,  
                              long start, 
                              long last) 
{ 
    // Find the mid value 
    // from start and last 
    long mid = (start + last) / 2; 

    if (start > last) 
    { 
        return -1; 
    } 

    // Check if we got the number which 
    // is square root of the perfect 
    // square number N 
    if (mid * mid == N) 
    { 
        return (int)mid; 
    } 

    // If the square(mid) is greater than N 
    // it means only lower values then mid 
    // will be possibly the square root of N 
    else if (mid * mid > N) 
    { 
        return checkPerfectSquare(N, start,  
                                  mid - 1); 
    } 

    // If the square(mid) is less than N 
    // it means only higher values then mid 
    // will be possibly the square root of N 
    else 
    { 
        return checkPerfectSquare(N, mid + 1,  
                                  last); 
    } 
}
dddzy1tm

dddzy1tm3#

你可以用一个事实,一个平方数是奇数整数的和。例如
1+3 = 4 = 2^2
1+3+5 = 9 = 3^2
1+3+5+7=16=4^2等

public static void main(String[] args) {
    for (int i = 1; i < 1000; i++) {
      if (isSquare(i)) System.out.println(i);     
    }
  }
  public static boolean isSquare(int n) {
    if (n==0 || n==1) return true;
    return isSquare(n,1,1);
  }

  private static boolean isSquare(int n, int sum, int odd) {
    if (n==sum) return true;
    if (n < sum) return false;
    odd += 2;
    sum += odd;
    return isSquare(n, sum, odd);
  }

输出:

1
4
9
16
25
36
49
64
81
100
121
144
169
196
225
256
289
324
361
400
441
484
529
576
625
676
729
784
841
900
961

相关问题