2014-01-15 1 views
0

Мне нужно проверить, что все элементы в моем List a: положительные. Мой метод использует (пытается использовать) рекурсию для проверки элементов> 0.

Мое сообщение об ошибке жалуется, что список пуст. Мне явно не хватает чего-то простого здесь, поэтому, пожалуйста, помогите мне понять, что происходит.Почему мой список пуст?

static boolean allPositive(List a) { 

    // If list is empty, show a warning message. 
    if (a.isEmpty()){ 
     System.out.println("No elements in list!"); 
    } 
     // If both head and tail are less than 0, return false. 
     if (a.getHead() >= 0 && allPositive(a.getTail())) { 
      return true; 
     } 
     // If there are elements < 0, return false. 
    return false; 
    } 

Вот класс List, довольно стандартный Я думаю:

public class List { 

private boolean empty; 
private int head; 
private List tail; 

// Constructor for List, creates a head and tail(another List). 
public List(int head, List tail) { 
    this.empty = false; 
    this.head = head; 
    this.tail = tail; 
} 

public List() { 
    this.empty = true; 
} 

// To add tail when creating List. 
public static List cons(int head, List tail) { 
    return new List(head,tail); 
} 

// Empty list. 
public static List empty() { 
    return new List(); 
} 

public boolean getEmpty() { 
    return this.empty; 
} 

public boolean isEmpty() { 
    return empty; 
} 

Ошибка говорит:

Исключение в потоке "главный" java.lang.IllegalStateException: Попытка голова пула пустого списка

Но список I Я использую здесь создается:

List a = List.cons(1, List.cons(2, List.cons(3, List.cons(4, List.empty())))); 

ответ

1

allPositive и рекурсивно в конечном итоге достичь хвост, который запускает пустое сообщение. Он также будет называть getHead пустыми элементами.

Если вы считаете пустой список, чтобы быть положительны, и вам не нужно предупреждающее сообщение, используйте:

static boolean allPositive(List a) { 
    if (a.isEmpty()) { 
     return true; 
    } else { 
     return (a.getHead() >= 0 && allPositive(a.getTail()) 
    } 
} 

Если вам нужно предупредительное сообщение о пустых списках, вы должны были бы сделать что-то например:

static boolean allPositive(List a) { 
    if (a.isEmpty()) { 
     System.out.println("No elements in list!"); 
    } 
    // This internal method won't warn on the empty list encountered during recursion. 
    return allPositiveInternal(a); 
} 

static boolean allPositiveInternal(List a) { 
    if (a.isEmpty()) { 
     return true; 
    } else { 
     return (a.getHead() >= 0 && allPositiveInternal(a.getTail()) 
    } 
} 
+0

«Внутренняя» функция не нужна. просто выпустите предупреждение и верните true, если список пуст. Только если вы хотите выбирать между тем, чтобы быть предупрежденным или нет внутри одной и той же программы, вам придется разделить (или добавить параметр «boolean verbose» или так далее). – Ronald

+0

Как вы различаете пустой хвост каждого непустого списка и пустой список без «внутреннего» варианта функции? – user2684301

+0

Спасибо, я вижу, что пустой список будет вызываться в конце рекурсивного процесса, поскольку он образует последний хвост. Мне кажется странным, что пустой список положителен, так как нуль не является ни + ve, ни -ve ?? Моя логика работает над проблемой, хотя теперь так снова спасибо. –