使用递归函数求解布尔方程

Solving a boolean equation with a recursive function

提问人:Heng Wei 提问时间:12/5/2020 最后编辑:Heng Wei 更新时间:12/5/2020 访问量:304

问:

我正在尝试编写一个函数,该函数将布尔方程作为其输入,并给出该方程的答案作为其输出。例如:

输入:T&F |F

输出: F

但是,当我对其进行编码时,我的 boolFunc 函数中会出现以下错误:“Non-void 函数不会在所有控制路径中返回值”。

#include <iostream>
#include <cstring>
using namespace std;

bool boolFunc(char* input, long len){
    if(len == 1){
        if(*input == 'T')
            return true;
        else
            return false;
    }
    
    else{
        for (int i = 0; i < len; i++) {
            if(*(input + i) == '&'){
                return boolFunc(input, i) && boolFunc(input+i+1, len-i);
            }
            if(*(input + i) == '|'){
                return boolFunc(input, i) || boolFunc(input+i+1, len-i);
            }
        }
    }
}


int main(){
    char input[500] = {'\0'};
    cin.getline(input, 500);
    
    if(boolFunc(input,strlen(input)))
        cout << "T";
    else
        cout << "F";
    
    return 0;
}

C++ 递归 表达式 运算布尔代

评论

0赞 dxiv 12/5/2020
错误消息准确地说明了问题所在。若要修复它,请确保在所有可能的情况下都返回一个值。例如,考虑一下如果调用 或 会发生什么。boolFuncboolFunc("", 0)boolFunc("1 2", 3)
0赞 Ken White 12/5/2020
编译器无法判断分支中会发生什么,如果两者都不是 或 。如果是输入会怎样?您的代码应处理这种情况,或者至少在函数的右括号之前添加一个默认返回值。else*(input)&|A
0赞 Heng Wei 12/5/2020
感谢您的快速回复!我编辑了我的代码,现在我认为所有控制路径都有返回,但错误仍然存在,我没有看到什么?
0赞 Sam Varshavchik 12/5/2020
弹出测验:如果以下语句的计算结果为“false”,即如果为 true,在这种情况下,您的函数返回什么?if(flag == false)flag
1赞 dxiv 12/5/2020
@HengWei 您在上次编辑中所做的所有更改都等同于在原始内容的最底部添加一个 .但是你把代码复杂化了,以至于编译器无法识别这一点。return false;boolFunc

答:

2赞 Heng Wei 12/5/2020 #1

我修复了这个错误,尽管可能还有另一个逻辑错误,在 T|F&F,操作顺序必须遵循正确的顺序(从左到右)

bool boolFunc(char* input, long len){
    if(len == 1){
        if(*input == 'T')
            return true;
        else
            return false;
    }
    
    else{
        for (int i = 0; i < len; i++) {
            if(*(input + i) == '&'){
                return boolFunc(input, i) && boolFunc(input+i+1, len-i);
            }
            if(*(input + i) == '|'){
                return boolFunc(input, i) || boolFunc(input+i+1, len-i);
            }
        }
    }
    //CORRECTION 
    return false;
}

评论

0赞 nanofarad 12/5/2020
您能否稍微解释一下您对原始代码所做的更改(例如问题是什么,以及您具体如何修复它)?它们将对问题的作者和其他读者有所帮助。
1赞 Heng Wei 12/5/2020
还行!我决定回答我自己的问题,因为有人在评论中给了我一个提示
0赞 nanofarad 12/5/2020
非常感谢,感谢您抽出宝贵时间添加它。