Are there any example of Mutual recursion?

前端 未结 8 811
迷失自我
迷失自我 2021-02-04 09:48

Are there any examples for a recursive function that calls an other function which calls the first one too ?

Example :

function1()
{    
    //do something         


        
8条回答
  •  无人共我
    2021-02-04 10:05

    Here is my coded solution. For a calculator app that performs *,/,- operations using mutual recursion. It also checks for brackets (()) to decide the order of precedence.

    Flow:: expression -> term -> factor -> expression 
    
        Calculator.h
        #ifndef CALCULATOR_H_
        #define CALCULATOR_H_
    
        #include 
        using namespace std;
    
        /****** A Calculator Class holding expression, term, factor ********/
        class Calculator
        {
        public:
            /**Default Constructor*/
            Calculator();
    
            /** Parameterized Constructor common for all exception
             * @aparam e exception value
             * */
            Calculator(char e);
    
            /**
             * Function to start computation
             * @param input - input expression*/
            void start(string input);
    
            /**
             * Evaluates Term*
             * @param input string for term*/
            double term(string& input);
    
             /* Evaluates factor*
             * @param input string for factor*/
            double factor(string& input);
    
             /* Evaluates Expression*
              * @param input string for expression*/
            double expression(string& input);
    
    
             /* Evaluates number*
              * @param input string for number*/
            string number(string n);
    
            /**
             * Prints calculates value of the expression
             * */
            void print();
    
            /**
             * Converts char to double
             * @param c input char
             * */
            double charTONum(const char* c);
    
            /**
             * Get error
             */
            char get_value() const;
            /** Reset all values*/
            void reset();
        private:
            int lock;//set lock to check extra parenthesis
            double result;// result
            char error_msg;// error message
        };
    
        /**Error for unexpected string operation*/
        class Unexpected_error:public Calculator
        {
        public:
            Unexpected_error(char e):Calculator(e){};
        };
    
        /**Error for missing parenthesis*/
        class Missing_parenthesis:public Calculator
        {
        public:
            Missing_parenthesis(char e):Calculator(e){};
        };
    
        /**Error if divide by zeros*/
        class DivideByZero:public Calculator{
        public:
            DivideByZero():Calculator(){};
        };
        #endif
        ===============================================================================
    
        Calculator.cpp
    
        //============================================================================
        // Name        : Calculator.cpp
        // Author      : Anurag
        // Version     :
        // Copyright   : Your copyright notice
        // Description : Calculator using mutual recursion in C++, Ansi-style
        //============================================================================
    
        #include "Calculator.h"
        #include 
        #include 
        #include 
        #include 
        using namespace std;
    
    
        Calculator::Calculator():lock(0),result(0),error_msg(' '){
    
        }
    
        Calculator::Calculator(char e):result(0), error_msg(e) {
    
        }
    
        char Calculator::get_value() const {
            return this->error_msg;
        }
    
        void Calculator::start(string input) {
            try{
            result = expression(input);
            print();
            }catch (Unexpected_error e) {
                cout<='0' && input[0]<='9'){
                string nums = input.substr(0,1) + number(input.substr(1));
                input = input.substr(nums.size());
                return stod(nums);
            }
            else {
                result = factor;
                throw Unexpected_error(input[0]);
            }
            return factor;
        }
    
        string Calculator::number(string input) {
            if(input.substr(0,2)=="E+" || input.substr(0,2)=="E-" || input.substr(0,2)=="e-" || input.substr(0,2)=="e-")
                return input.substr(0,2) + number(input.substr(2));
            else if((input[0]>='0' && input[0]<='9') || (input[0]=='.'))
                return input.substr(0,1) + number(input.substr(1));
            else
                return "";
        }
    
        void Calculator::print() {
            cout << result << endl;
        }
    
        void Calculator::reset(){
            this->lock=0;
            this->result=0;
        }
        int main() {
    
            Calculator* cal = new Calculator;
            string input;
            cout<<"Expression? ";
            getline(cin,input);
            while(input!="."){
                cal->start(input.substr(0,input.size()-2));
                cout<<"Expression? ";
                cal->reset();
                getline(cin,input);
            }
            cout << "Done!" << endl;
            return 0;
        }
        ==============================================================
        Sample input-> Expression? (42+8)*10 =
        Output-> 500
    

提交回复
热议问题