Написание рекурсивного метода, который создает случайное выражение

#java

#java

Вопрос:

Я должен написать рекурсивный метод для генерации выражения в дереве выражений. Метод должен иметь параметр, который ограничивает «высоту» дерева выражений. maxHeight дает максимально допустимую высоту, а не фактическую высоту. Узлы для констант, переменных и двоичных операторов уже созданы, но у меня возникают проблемы с получением метода для работы. Ниже приведен метод, который я создал, и один из узлов дерева. Я все еще изучаю Java, поэтому, пожалуйста, будьте добры. Любая помощь будет оценена.

 static ExpNode randomExpression(int maxHeight) {
        ExpNode e1 = new BinOpNode(' ', new VariableNode(), new ConstNode(maxHeight));
        ExpNode e2 = new BinOpNode('*', new ConstNode(maxHeight), new VariableNode());
        ExpNode e3 = new BinOpNode('*', e1, e2);
        ExpNode e4 = new BinOpNode('-', e1, new ConstNode(-3));
        if (maxHeight < 0) {
            return null;
        }
        if (maxHeight == 0) {           
            
            return new BinOpNode('-', e1, e2);
        } 
        if (maxHeight > 0) {            
            maxHeight  ;
            return  new BinOpNode('/', e3, e4);
        }
        return randomExpression(maxHeight);
        
    }

static class BinOpNode extends ExpNode {
        char op;  // the operator, which must be ' ', '-', '*', or '/'
        ExpNode left, right;  // the expression trees for the left and right operands.
        BinOpNode(char op, ExpNode left, ExpNode right) {
            if (op != ' ' amp;amp; op != '-' amp;amp; op != '*' amp;amp; op != '/')
                throw new IllegalArgumentException("'"   op   "' is not a legal operator.");
            this.op = op;
            this.left = left;
            this.right = right;
        }
        double value(double x) {
            double a = left.value(x);  // value of the left operand expression tree
            double b = right.value(x); // value of the right operand expression tree
            switch (op) {
            case ' ': return a   b;
            case '-': return a - b;
            case '*': return a * b;
            default:  return a / b;
            }
        }
        public String toString() {
            return "("   left.toString()   op   right.toString()   ")";
        }
    }
      
    
        }
  

Комментарии:

1. Можете ли вы дать более подробное описание того, что на самом деле означает «проблемы с запуском метода»? С какой частью кода у вас возникли проблемы? Что работает не так, как вы ожидаете? Не компилируется ли код? Вы получаете сообщение об ошибке при его запуске? Вы получаете неправильный результат при его запуске?

2. Привет @OHGODSPIDERS, программа убедительна без ошибок. Обратная связь, которую я получил, заключается в том, что я должен просмотреть эту строку «return randomExpression(maxHeight);» потому что она не будет выполнена, и я также увеличиваю значение maxHeight (параметр) перед возвращаемым предложением, которое не имеет никакого эффекта.

3. В этом случае я не совсем понимаю, какую дополнительную информацию вы ожидаете. Это довольно специфический отзыв, который уже указывает на ваши точные ошибки. Если вам нужен дополнительный совет о том, почему этот оператор return никогда не выполняется: взгляните на операторы if с приведенными выше операторами return if (maxHeight < 0) и попытайтесь придумать значение maxHeight , которое приведет к тому, что ваш код достигнет строки return randomExpression(maxHeight);

4. Спасибо, @OHGODSPIDERS. Я изменил один оператор if на оператор for . Кажется, все работает нормально.