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

use*_*971 5 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

nik*_*o28 9

让我们试着理解代码.

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

我们将遵循向后的方法,因为它是一个递归函数.例如,让我们说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个输出作为可能的位01.

现在让我们假设n = 2,

该方法被binary(2) arr[2-1]设置为'0'(arr[2-1] = arr[1] = ‘0’)

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

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

我们再次调用binary(1); 此时间arr[1]设置为"1",因此我们再获得2个输出(10和11).

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

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

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


小智 6

这是 n=3 的递归流程,

在此处输入图片说明