递归地将整数从1 ^ 2添加到n ^ 2

时间:2014-11-25 05:40:55

标签: 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方法以使其工作。 任何帮助,将不胜感激。谢谢!

3 个答案:

答案 0 :(得分:2)

一般来说,在尝试解决递归问题时,在编程之前尝试将它们弄清楚是有帮助的。

您希望将1 2 中的所有整数与n 2 相加。我们需要做的第一件事就是以适合递归的方式表达这一点。好吧,说明这笔钱的另一种方式是:

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

第一步通常是最难的,因为它是最“明显”的。例如,我们知道“a + b + c”与“a + b”相同,再加上“c”,但是我们必须对各种各样的信念进行一次飞跃,并将其说明为将其转化为递归形式。

所以,现在我们必须处理特殊的基础案例,0:

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

所以让我们让recurvMath(n)为从1 2 到n 2 的所有整数的总和。然后,以上直接转换为:

  • recurvMath(n)= recurvMath(n-1)+ n 2
  • 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的基本情况,所以你永远不会终止。最终你得到一个整数溢出,结果不正确,或者堆栈溢出。

答案 1 :(得分:0)

试试这个

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 == 1){
            return 1; 
        }//end if
        // More simplified solution
        return recurvMath(n-1) + (int) Math.pow(n, 2); // Here is made changes

    }//end method       
}//end class

答案 2 :(得分:0)

而不是说:

return (recurvMath((int) ((int) n+Math.pow(n, 2))));
我反而说:

return (int) ((Math.pow(n, 2)+recurvMath(n-1)));