我在将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的基本情况,因此永远也不会终止。最终,您要么得到整数溢出而结果不正确,要么出现堆栈溢出。

10-06 01:51