2014-11-25 3 views
0

У меня возникают проблемы с рекурсивно добавлением целых чисел в java от 1^2 до n^2. Я хочу иметь возможность рекурсивно выполнять это в методе recurvMath, но все, что я получаю, - это бесконечный цикл.рекурсивно добавляют целые числа от 1^2 до n^2

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 чтобы он работал. Любая помощь будет оценена по достоинству. Благодаря!

+1

Чтобы сделать его суммой, возможно, вам следует добавить две или более вещи вместе? – hobbs

+0

Почему вы хотите сделать это рекурсивно? 'int s = 0; for (int i = 1; i

+3

@ElliottFrisch Я пытаюсь понять рекурсию в java. Что еще лучше попробовать? – ekep23

ответ

2

В общем, при попытке решить рекурсивные проблемы, это помогает, чтобы попытаться выработайте их в своей голове перед их программированием.

Вы хотите суммировать все целые числа от 1 до n . Первое, что нам нужно сделать, это выразить это таким образом, который поддается рекурсии. Ну, еще один способ задания этой суммы:

  • Сумма всех целых чисел от 1 к (п-1) , плюс п

Это первый шаг как правило, самый сложный, потому что это самый «очевидный». Например, мы знаем, что «a + b + c» совпадает с «a + b», плюс «c», но мы должны совершить скачок веры в родах и указать его таким образом, чтобы получить его в рекурсивный форма.

Итак, теперь мы должны позаботиться о специальном базовом случае, 0:

  • При п = 0, то сумма 0.

Итак, давайте пусть recurvMath(n) будет сумма все целые числа от 1 до n . Затем, выше, непосредственно переводится:

  • recurvMath (п) = recurvMath (п-1) + п
  • 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, и поэтому вы никогда не заканчиваете. В конце концов вы либо получите переполнение целых чисел с неправильными результатами, либо переполнение стека.

+0

Очень легко понять, спасибо. – ekep23

+0

Даже не нужно 'else' в вашем решении :) – Junaid

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 
+0

Я получил это далеко, но я не могу понять, почему я должен отправлять (n-1) в качестве аргумента вместо n. – ekep23

+0

В противном случае стек будет переполняться. Означает, что ваше базовое условие никогда не ударит. Или, другими словами, вы вызываете функцию снова и снова бесконечно. Если вы нашли мой ответ полезным, пожалуйста, отметьте его правильно. – Junaid

+0

Спасибо @JasonC ответ обновлен. – Junaid

0

вместо того чтобы сказать:

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

я вместо этого сказал:

return (int) ((Math.pow(n, 2)+recurvMath(n-1))); 
Смежные вопросы