В этом задании много сообщений, большинство из которых хотят знать, как это сделать. Пожалуйста, дайте мне разобраться в этом самостоятельно - я просто ищу одну или две части помощи, а не кому-то, чтобы выполнить свое задание для меня.Ошибка переполнения стека в рекурсивной синтаксисе. Домашняя домашняя работа
Назначение - написать программу, которая реализует правила синтаксиса для построения произвольных предложений.
Когда я реализую свой код, я получаю переполнение стека, но я смоделировал его после кода примера, который не имеет этой ошибки. Я знаю, что это что-то с моим заявлением if...else
в sentence();
, вызывающим его.
Вот мой код:
import java.util.Random;
import java.util.ArrayList;
import java.util.List;
public class RecursiveSyntax {
private static final String[] conjunction = { "and", "or", "but", "because" };
private static final String[] properNoun = { "Fred", "Jane", "Richard Nixon", "Miss America" };
private static final String[] commonNoun = { "man", "woman", "fish", "elephant", "unicorn" };
private static final String[] determiner = { "a", "the", "every", "some" };
private static final String[] adjective = { "big", "tiny", "pretty", "bald" };
private static final String[] intransitiveVerb = { "runs", "jumps", "talks", "sleeps" };
private static final String[] transitiveVerb = { "loves", "hates", "sees", "knows", "looks for", "finds" };
public static void main(String[] args) {
List<String[]> arrayList = new ArrayList<>();
arrayList.add(conjunction);
arrayList.add(properNoun);
arrayList.add(commonNoun);
arrayList.add(determiner);
arrayList.add(adjective);
arrayList.add(intransitiveVerb);
arrayList.add(transitiveVerb);
while (true) {
sentence();
System.out.println(".\n\n");
try {
Thread.sleep(3000);
}
catch (InterruptedException e) {
}
}
}
private static void sentence() {
int c = (int)(Math.random()*conjunction.length);
double x = Math.random();
if (x < 0.2)
simpleSentence();
else
simpleSentence();
System.out.print(conjunction[c]);
sentence();
}
private static void simpleSentence() {
nounPhrase();
verbPhrase();
}
private static void nounPhrase() {
int pn = (int)(Math.random()*properNoun.length);
System.out.print(" "+ properNoun[pn] + " ");
}
private static void verbPhrase() {
int iv = (int)(Math.random()*intransitiveVerb.length);
System.out.print(" " + intransitiveVerb[iv]);
}
}
Я просто смотрю на две вещи:
- Как исправить мою ошибку переполнения стека
- Что я делаю неправильно с моей
if..else
заявление?
Мне нужно позвонить simpleSentence()
части времени, а на случайных взвешенных проценты времени вызова simpleSentence
, а затем напечатать случайное соединение из массива конъюнкции, а затем запустить sentence()
снова без ошибок переполнения стека.
БНФ для этой части:
<sentence> ::= <simple_sentence> [ <conjunction> <sentence> ]
<simple_sentence> ::= <noun_phrase> <verb_phrase>
Копии требований назначения можно найти здесь (если это необходимо для ясности) Par 1 Рекурсивного Синтаксис: http://math.hws.edu/eck/cs225/s10/lab3/.
Ошибка stackoverflow означает, что вы повторяете слишком много раз. – Carcigenicate
Если я правильно понимаю ваш код, 'sentance' будет называть себя 80% времени. – Carcigenicate
Спасибо за ответ. Я знаю об этом, но я не уверен, как ограничить рекурсию. Я полагаю, что это происходит в инструкции if ... else, но я не уверен, почему это происходит здесь, когда в этом примере кода нет, чтобы вести нас через это задание. –