2013-11-18 6 views
0

Я написал метод для оценки треугольника Pascal из n строк. Однако, когда я тестирую метод, я получаю сообщение об ошибке «Исключение в потоке» main «java.lang.ArrayIndexOutOfBoundsException: -1». Вот код.Рекурсивный метод для треугольника Паскаля для Java

public static int[] PascalTriangle(int n) 
{ 
    int[] pt = new int[n+1]; 
    if(n == 0) 
    { 
     pt[0] = 1; 
     return pt; 
    } 
    int[] ppt = PascalTriangle(n-1); 
    pt[0] = pt[n] = 1; 
    for(int i = 0; i < ppt.length; i++) 
    { 
     pt[i] = ppt[i-1] + ppt[i]; 
    } 
    return pt; 
} 

Пожалуйста, дайте мне знать, если у вас есть идеи по редактированию кода для устранения проблемы.

+4

Вот одна идея: не пытайтесь читать 'ppt [-1]'. Это то, что делает ваш код. – ajb

+0

Линия 'pt [i] = ppt [i-1] + ppt [i];' будет равна 'pt [0] = ppt [-1] + ppt [0]' на первой итерации. – syrion

+0

Я бы настоятельно рекомендовал изучить, как использовать отладчик Java (например, встроенный в вашу среду IDE), когда вы получаете такую ​​ошибку, вы можете приостановить выполнение в строке и увидеть неудобные значения. В противном случае вы могли бы просто поместить в свой код инструкции println, чтобы показать значение 'i', которое должно надеяться сделать очевидным, что вы пытаетесь получить доступ к' ppt [-1] ' –

ответ

4
for(int i = 0; i < ppt.length; i++) 
    { 
     pt[i] = ppt[i-1] + ppt[i]; 

В вашей первой итерации i == 0 и так (i-1) == -1. Это является причиной ошибки.

Вы можете специально управлять границами, чтобы избежать этого. Или как другие полагают, начать i на 1 вместо 0.

+1

Запустить цикл в 1! –

0

В этом коде:

pt[0] = pt[n] = 1; 
for(int i = 0; i < ppt.length; i++) 
{ 
    pt[i] = ppt[i-1] + ppt[i]; 
} 

проблема заключается в том, что когда i является 0, вы пытаетесь получить доступ к ppt[i-1], который ppt[-1]. Следует заметить, что когда i равно 0, вам не нужно выполнять оператор, который устанавливает pt[i], потому что вы уже установили pt[0] перед циклом! Попробуйте инициализацию i к 1 вместо 0.

0

Вот код моего друг придумал

import java.util.Scanner; 
public class Pascal { 
    public static void main(String[] args) { 
    Scanner scanner = new Scanner(System.in); 
    System.out.print("Enter the number of rows to print: "); 
    int rows = scanner.nextInt(); 
    System.out.println("Pascal Triangle:"); 
    print(rows); 
    scanner.close(); 
    } 

    public static void print(int n) { 
    for (int i = 0; i < n; i++) { 
     for (int k = 0; k < n - i; k++) { 
     System.out.print(" "); // print space for triangle like structure 
     } 
     for (int j = 0; j <= i; j++) { 
     System.out.print(pascal(i, j) + " "); 
     } 
     System.out.println(); 
    } 
    } 

    public static int pascal(int i, int j) { 
    if (j == 0 || j == i) { 
     return 1; 
    } else { 
     return pascal(i - 1, j - 1) + pascal(i - 1, j); 
    } 
    } 
} 

День рекурсии!

Смежные вопросы