生成'n'位的所有字符串。假设A [0 ... .n-1]是大小为n的数组

时间:2015-10-28 11:33:27

标签: recursion

void binary(int n)
{
    if(n < 1)
        printf("%s\n",A);    // Assume A is a global variable
    else
    {
        A[n-1] = '0';
        binary(n-1);
        A[n-1] = '1';
        binary(n-1);
    }
}

任何人都可以解释n = 2的堆栈帧吗?我的意思是当n = 2时,我正在进行干运行时00。但是我还缺少一个01。有人可以解释为此代码生成的堆栈帧是什么。

3 个答案:

答案 0 :(得分:8)

让我们尝试理解代码。

if(n < 1)
    printf("%s\n",arr);
else
{
    arr[n-1] = '0';
    binary(n-1);
    arr[n-1] = '1';
    binary(n-1);
}

我们将遵循向后的方法,因为它是一个递归函数。例如,让我们说n = 1

该方法称为binary(1);
arr[n-1]设置为‘0’ (arr[1-1] = arr[0] = ‘0’)

现在我们致电binary(0);
(n<1)以来我们打印arr(打印0)

通话返回arr[n-1] = ‘1’
arr[1-1]设置为“1”(arr[1-1] = arr[0] = ‘1’)

现在我们致电binary(0);
(n<1)以来我们打印arr(打印1)

因此,我们得到了2个输出位[{1}}和0

现在让我们假设1

该方法称为n = 2 binary(2)设置为“0”arr[2-1]

现在我们致电(arr[2-1] = arr[1] = ‘0’)
从上面的解释我们知道binary(1);binary(1)生成0和1的输出。 这里arr[0]设置为0.所以我们得到2个输出(00和01)。

该函数返回arr[1]
arr[n-1] = ‘1’设置为1 arr[2-1]

我们再次致电(arr[2-1] = arr[1] = ‘1’) 此时binary(1);设置为“1”,因此我们再获得2个输出(10和11)。

屏幕上总共有4个输出..(00,01,10,11)这些都是2位的字符串。

同样,你可以解决arr[1] n = 3.设置为“0”并调用arr[2]。这产生(000,010,100,110) 然后将binary(2)设置为“1”并调用arr[2]。这产生(001,011,101,111)。 这些都是3位的字符串。

我希望这种方法能够说清楚。请随意提出其他任何问题。

答案 1 :(得分:3)

这是n = 3的递归流,

enter image description here

答案 2 :(得分:0)

您的说明存在问题:

现在我们调用binary(1); 从上面的解释我们知道二进制(1)为arr [0]产生0和1的输出。这里arr [1]设置为0.所以我们得到2个输出(00和01)。

此处的输出为00和10,因为arr [1]设置为0。

类似地,当arr [1]设置为1时,输出将为01和11。

我希望你同意