【问题标题】:what will happen if we pass an argument to a C++ recursive function like "pass_by_keyword" in python?如果我们将参数传递给 C++ 递归函数(如 python 中的“pass_by_keyword”)会发生什么?
【发布时间】:2022-11-26 22:11:47
【问题描述】:
int dfs(int idx, int mv, char gest){
    if (idx > n || mv > k){
        return 0;
    }
    int tmp1 = 0;
    if(mv<k){
        if(fj[idx]=='H'){
            if(gest!='P'){
                tmp1=1+dfs(idx+1,mv+1, gest='P');
            }
            else{
                tmp1=1+dfs(idx+1, mv, gest='P');
            }
        }
        else if(fj[idx]=='P'){
            if(gest!='S'){
                tmp1=1+dfs(idx+1,mv+1, 'S');
            }
            else{
                tmp1=1+dfs(idx+1, mv, 'S');
            }
        }
        else if(fj[idx]=='S'){
            if(gest!='H'){
                tmp1=1+dfs(idx+1,mv+1,'H');
            }
            else{
                tmp1=1+dfs(idx+1, mv, 'H');
            }
        }
    }
    int tmp2 = 0;
    if (check(fj[idx], gest)){
        tmp2 = 1 + dfs(idx + 1, mv, gest);
    }
    else{
        tmp2 = dfs(idx + 1, mv, gest);
    }
    return max(tmp1, tmp2);
}

为了完成一道OI题,我写了前面的dfs函数,但是第9行和第12行导致结果不正确。如果我删除参数前面的“gest=”,结果是正确的。为什么?这样的函数传参会给C++带来什么问题呢?

if(mv<k){
        if(fj[idx]=='H'){
            if(gest!='P'){
                tmp1=1+dfs(idx+1,mv+1, 'P');
            }
            else{
                tmp1=1+dfs(idx+1, mv, 'P');
            }
        }
        else if(fj[idx]=='P'){
            if(gest!='S'){
                tmp1=1+dfs(idx+1,mv+1, 'S');
            }
            else{
                tmp1=1+dfs(idx+1, mv, 'S');
            }
        }
        else if(fj[idx]=='S'){
            if(gest!='H'){
                tmp1=1+dfs(idx+1,mv+1,'H');
            }
            else{
                tmp1=1+dfs(idx+1, mv, 'H');
            }
        }
    }

这是正确的。

【问题讨论】:

    标签: python c++


    【解决方案1】:

    C++ 不支持命名参数。你在做什么等同于:

    gest='P';
    tmp1=1+dfs(idx+1,mv+1, gest);
    

    【讨论】:

      【解决方案2】:

      在 C++ 中,您不能像在 python 中那样指定参数名称以在调用函数时使用值。

      dfs(idx+1,mv+1, gest='P')
      

      将用'P' 覆盖gest 参数的值,然后评估为新值,因此在此表达式之后gest 具有不同的值。

      IE。下面2个sn-ps的作用是一样的:

      tmp1=1+dfs(idx+1,mv+1, gest='P');
      
      gest = 'P';
      tmp1=1+dfs(idx+1,mv+1, gest);
      

      【讨论】:

        猜你喜欢
        • 2013-04-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-16
        • 1970-01-01
        • 1970-01-01
        • 2014-02-07
        • 2020-03-22
        相关资源
        最近更新 更多