Попытка проверить математическое выражение рекурсивно - что не так с этим кодом? - PullRequest
2 голосов
/ 25 февраля 2012

Действительное выражение = одна цифра

И

Действительное выражение = ( Действительное выражение + Действительное выражение )

Это означает, что булева функция, которую я пытаюсь создать, будет принимать только как допустимые выражения следующего типа:

5
(5+3)
(6+(3+2))
((7+1)+(5+1))
............... etc.

Я хочу, чтобы параметры моей функции остались такими, какие они есть (istringstream & is), и я хочу использовать get (ch) в своей функции.

Я также хочу сделать это рекурсивно. Тем не менее, я делаю что-то не так, и он проверяет только выражения типа: одна цифра

Где проблема в моей рекурсии? И я знаю, что это даже не правильная рекурсия, я уверен, что правильная рекурсия могла бы выполнить работу даже в меньшем количестве строк и без вложенных ifs.

Спасибо за любые полезные предложения!

#include <iostream>
#include <string>
#include <sstream>
#include <cctype>

using namespace std;

bool isvalid(istringstream& is)
{
    char ch;
    is.get(ch);
    if(ch-'0'>=0 || ch-'0'<=9) return true;
    if(ch=='(' && isvalid(is))
    {   
        is.get(ch);
        if(ch=='+' && isvalid(is))
        {
            is.get(ch);
            if(ch==')') return true;
        }
     }
     return false; 
}
bool empty(istringstream& is)
{
    char ch;
    is.get(ch);
    return is.fail(); 
}

int main() 
{    
    string s;    
    while(getline(cin,s))    
    {   
        istringstream is(s);
        cout<<(isvalid(is) && empty(is) ? "Expression OK" : "Not OK")<<endl;    
    } 
 }

Ответы [ 4 ]

0 голосов
/ 25 февраля 2012
if(ch-'0'>=0 || ch-'0'<=9) return true;

Это должно быть && выражение, не так ли?

0 голосов
/ 25 февраля 2012

In if(ch==')' && isvalid(is)) return true;

Я не думаю, что вам нужна часть && isvalid(is).Это не следует вашей грамматике

0 голосов
/ 25 февраля 2012

Внутренний if (ch == ')' && ...) всегда будет ложным (поскольку ch == '+', если вы доберетесь до этого if) - отсутствует get (ch).

0 голосов
/ 25 февраля 2012

Подумайте о строке ().Это будет выглядеть так:

isvalid ("()"): ch = '(' не в 0-9, поэтому он переходит к следующей строке ch == '(', поэтому он оценивает isValid(is).

второй уровень: isvalid (")"): ch = ')', опять же, не 0-9, поэтому он переходит к следующей строке ch! = '(', поэтому он замыкает цепивычисление логического выражения и возвращает false

обратно на первый уровень: isvalid (is) не удалось, поэтому мы пропускаем блок if и возвращаем false

...