字符串&是不是反映了所做的改变但是String在传递参数的同时做了....

时间:2014-02-12 02:03:23

标签: c++ string recursion pass-by-reference

问题 - 给定一个字符串'0','1'和'?'。生成所有可能的字符串,您可以替换'?' '0'或'1'?

例如 - 输入 - “0 ??”          输出 - “000”,“001”,“010”,“011”。

我为它写了一个简单的程序 -

void gen(string& str, int index)
{
    int i;
    if(str.length() == index)
    {
        cout << str << endl;
        return;
    }
    else
    {
        for(i=index; str[i]!='\0' && str[i]!='?';i++);

        if(str[i] == '?')
        {
            str[i] ='0';
            gen(str,i+1);
            str[i] ='1';
            gen(str,i+1);
        }
    }
    return;
}

int main()
{
    string s ="0??";
    gen(s, 0);
    return 0;
}

它无法正常工作.... 如果您将void gen(String&amp;,int)中的论据替换为

void gen(String,int)....

然后它将正常工作..

任何人都可以解释我......

3 个答案:

答案 0 :(得分:1)

引用将保持函数调用中更改的值

after set str[1] ='0';

sub call: gen(str,2); will output combination: 000 001

reset str[1] ='1';

str is still 011

gen(str,i+1); output nothing 

希望这段代码可以提供帮助

#include <string>
#include <iostream>
#include <stdio.h>
using namespace std;
void gen(string& str, int index)
{
    int i;
    if(str.length() == index)
    {
        cout << str << endl;
        return;
    }
    else
    {
        for(i=index; str[i]!='\0' && str[i]!='?';i++);

        if(str[i] == '?')
        {
            printf("before set pos %d to 0: %s\n",i,str.c_str());
            str[i] ='0';
            printf("after set pos %d to 0: %s\n",i,str.c_str());
            gen(str,i+1);
            printf("before set pos %d to 1: %s\n",i,str.c_str());
            str[i] ='1';
            printf("after set pos %d to 1: %s\n",i,str.c_str());

            gen(str,i+1);
        }
    }
    return;
}

int main()
{
    string s ="0??";
    gen(s, 0);
    return 0;
}

输出:

enter image description here

答案 1 :(得分:1)

当您通过引用传递字符串时,所有递归gen()的调用都会运行一个字符串 - 而不是每次调用gen()在自己的本地副本上工作。每次递归调用gen()都会修改(共享)字符串,删除所有“?”字符;当那个电话回来时,没有更多'?'剩下要处理的字符,所以它只是终止。

当您通过值传递字符串时,gen()函数的每次调用都会获得自己的字符串本地副本;当函数返回上一级时,它对该字符串所做的任何更改都会被丢弃并被遗忘。在这种情况下,你的逻辑是正确的。

(还有一个错误导致它在我的Windows机器上崩溃,直到我修复它:std::string不是空终止的,所以不应该检查std[i] == '\0'你应该做i < str.length()之类的事情{1}}。)

答案 2 :(得分:0)

一个简单的解决方案是:

每个'?'应该用0和1替换,我们可以看到字符串中有'2 **(数量?)'这样的可能替换。例如,如果我们有三个'?'在字符串中将有8个这样的可能替换,如果我们考虑它们的数值,它们将是0,1,2 ...,7并且其二进制表示将是000,001,002,....,111。基本上我们应该取数值并用数值中的位替换'?'。