印刷中的排列错误?

时间:2016-03-13 05:45:50

标签: c arrays

有两个函数,一个在数组中交换整数,另一个递归获得没有信誉的所有排列。但它为所有排列打印0,1。 l为0,r为(数组-1的大小)。

对于置换,数组a的输入为{0,1,1}。

void swap(int a[], int first, int second, int r)
{
    if (second > r)
    {
        int tempp = a[first];
        a[first] = a[second];
        a[second] = tempp;
    }

}


void permute(int a[], int l, int r)
{
    int i;
    if (l == r){
        for (int i = 0; i < l; i++)
        {
            printf("%d",a[i]);
            if (i == (r - 1))
            {
                printf("\n");
            }
        }
    }
    else
    {
        for (i = l; i <= r; i++)
        {
            swap(a,l, i,r);
            permute(a, l+1, r);
            swap(a,l, i,r);
        }
    } 
}

1 个答案:

答案 0 :(得分:0)

由于second > r中第二个swap()语句中的条件,for中的条件permute()始终为false。

删除有害状况并根据需要添加范围检查。

void swap(int a[], int first, int second, int r)
{
    if (0 <= first && first <= r && 0 <= second && second <= r) /* range check */
    {
        int tempp = a[first];
        a[first] = a[second];
        a[second] = tempp;
    }

}

for (int i = 0; i < l; i++)更改为for (int i = 0; i <= l; i++)
如果要打印数组中的所有元素而不是省略最后一个元素,请将if (i == (r - 1))更改为if (i == l)