java - 递归地将 1^2 到 n^2 的整数相加

标签 java recursion

我在java中从1^2到n^2递归地添加整数时遇到了一些麻烦。 我希望能够在 recurvMath 方法中递归地执行此操作,但我得到的只是一个无限循环。

import java.util.Scanner;

public class Lab9Math {

int count = 0;
static double squareSum = 0;


public static void main(String[] args){

    int n = 0;
    Scanner scan = new Scanner(System.in);
    System.out.println("Please enter the value you want n to be: ");
    n = scan.nextInt();

    Lab9Math est = new Lab9Math();
    squareSum = est.recurvMath(n);
    System.out.println("Sum is: "+squareSum);
}

public int recurvMath(int n){

    System.out.println("N:" +n);
        if(n == 0){
            return 0; 
        }//end if
        if (n == 1){
            return 1;
        }//end if
        if (n > 1){
            return (recurvMath((int) ((int) n+Math.pow(n, 2))));
        }//end if
        return 0;
    }//end method       
}//end class

我没有完全理解递归定义的本质,因为我知道我可以到达这里:

return (int) (Math.pow(n, 2));

但我无法正确合并 recurvMath 方法的调用以使其正常工作。 任何帮助,将不胜感激。谢谢!

最佳答案

一般来说,当尝试解决递归问题时,在编程之前尝试在头脑中解决它们会有所帮助。

您想要对 12 到 n2 之间的所有整数求和。我们需要做的第一件事是以适合递归的方式表达它。那么,表述这个总和的另一种方式是:

  • 从 12 到 (n-1)2 的所有整数之和,加上 n2

第一步通常是最难的,因为它是最“明显”的。例如,我们知道“a + b + c”与“a + b”加上“c”相同,但我们必须采取某种信念的飞跃并以这种方式陈述它以使其进入递归表格。

所以,现在我们必须处理特殊的基本情况,0:

  • 当 n 为 0 时,总和为 0。

所以让我们 recurvMath(n)是从 12 到 n2 的所有整数之和。那么,上面的内容直接转化为:

  • recurvMath(n) = recurvMath(n-1) + n2
  • recurvMath(0) = 0

这很容易实现:

public int recurvMath(int n){    
    System.out.println("N:" +n);
    if(n == 0){
        return 0; 
    } else {
        return recurvMath(n-1) + (n * n);
    }
}

注意我选择了 n * n而不是Math.pow() 。这是因为Math.pow()运行于 double ,不在int上.

顺便说一句,您可能还想保护自己免受用户输入负数作为输入的影响,这可能会让您陷入困境。您可以使用if (n <= 0)而不是if (n == 0) ,或者检查负输入并抛出例如IllegalArgumentException ,甚至使用Math.abs()适本地赋予它处理负数的能力。

<小时/>

此外,为了完整起见,让我们看一下原始代码中的问题。您的问题是:

recurvMath((int) ((int) n+Math.pow(n, 2)))

让我们在脑海中追溯一下这一点。您的其中之一int强制转换是不必要的,但忽略它,当 n == 3这是recurvMath(3 + Math.pow(3, 2))这是 recurvMath(12) 。你的数字每次都会变大。你永远不会遇到 1 或 0 的基本情况,因此你永远不会终止。最终,您要么得到整数溢出并得到不正确的结果,要么得到堆栈溢出。

关于java - 递归地将 1^2 到 n^2 的整数相加,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27119528/

相关文章:

java - 当调用类的任何方法时中断

python - 如何创建任意数量的嵌套循环?

javascript - 在 JavaScript 解释器的树遍历算法中存在堆栈溢出问题?

java - 使用阶梯模式为每次调用递归打印两行

algorithm - 想在对排序矩阵使用二进制搜索逻辑时了解时间复杂度

java - 按自然顺序比较字符串但忽略字符串的前缀

java - 如何将日期字符串转换为java日期?

java - 如何以固定的时间间隔运行后台作业方法?

java - JavaFX 中多个 FXML/Controller 的根不能为 null 异常

windows - 递归删除所有以开头的文件夹