2017-02-09 51 views
0

此作業中存在大量帖子 - 最想知道如何去做。請讓我自己弄清楚其餘部分 - 我只是尋找一兩點幫助,而不是有人爲我完成我的任務。遞歸語法上的堆棧溢出錯誤實驗室作業

該任務是編寫一個程序,實現語法規則來構建隨機語句。

當我實現了我的代碼,我得到一個堆棧溢出,但我不會有錯誤示例代碼爲藍本的。我知道這是我的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]); 

     } 


    } 

我只是在尋找兩件事情:

  1. 如何解決我的堆棧溢出錯誤
  2. 我在做什麼毛病我if..else聲明?

我需要它來打電話simpleSentence()一些的時間,並在時間的呼叫simpleSentence的隨機加權百分比,然後打印從結合陣列隨機相結合,然後在沒有堆棧溢出錯誤再次運行sentence()

的BNF這部分是:

<sentence> ::= <simple_sentence> [ <conjunction> <sentence> ] 
<simple_sentence> ::= <noun_phrase> <verb_phrase> 

的分配要求的副本可以在這裏找到(如果它需要的清晰度)標準桿1遞歸語法:http://math.hws.edu/eck/cs225/s10/lab3/

+1

一個stackoverflow錯誤意味着你遞歸太多次了。 – Carcigenicate

+0

如果我正確理解你的代碼,'sentance'會在80%的時間內調用它自己。 – Carcigenicate

+0

感謝您的回覆。我意識到這一點 - 但我不知道如何限制遞歸。我相信這是在if ... else語句中發生的,但我不確定爲什麼會發生這種情況,當它不在給出的指導示例代碼的示例代碼中時。 –

回答

0

不,句子會自動調用自己100%的時間...這不是python, 因此您的縮進是誤導。你需要做其他的事情simpleSentence(); ... sentence()}。正如所寫的,else之後只有第一個 聲明是其中的一部分。 - 歡

這解決它完美!謝謝Foon!