使用递归

时间:2016-04-24 08:09:53

标签: c recursion

我编码如下,打印三个数字的所有排列:1,2,3。

但输出是:
1,1,1
1,1,2
1,1,3
1,2,1
1,2,2
1,2,3

代码如下:

#include<stdio.h>
#include<conio.h>

void perm(int);

int a[10],l=2;

int main()
{
    int k;
    k=0;
    perm(k);
    getch();
    return 0;
}

void perm(int k)
{
    int i;
    for(a[k]=1;a[k]<=3;a[k]++)
    {
        if(k==2)
        {
            for(i=0;i<3;i++)
            {
                printf("%d ",a[i]);
            }
            printf("\n");
        }
        else
        {
            k++;
            perm(k);
        }
    }
}

请提供正确的密码。

2 个答案:

答案 0 :(得分:0)

为什么要增加k?对于k的给定调用,perm()不应更改。

同样有点太糟糕了,不能坚持3种排列,你可以很容易地用这种方式概括:

#include<stdio.h>
#include<conio.h>

static void perm(int, int);
static void all_perm(int);

int a[10];

int main()
{
    all_perm(3);
    getch();
    return 0;
}

void all_perm(int n)
{
    perm(0, n);
}

void perm(int k, int n)
{
    if (k == n)
    {
        for(int i = 0; i < n; i++)
        {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    else
    {
        for(a[k]=1; a[k] <= n; a[k]++)
        {
            perm(k + 1, n);
        }
    }
}

编辑:嗯,你所说的排列不是排列。

答案 1 :(得分:0)

我使用的逻辑在某种程度上与你的相似。 我已将整个代码包括在内以便明确。

#include <stdio.h>

void recn(int*,int,int);
void print_arr(int*,int);
    void main()
    {
        int arr[3] = {1,2,3};
        recn(arr,3,0);
    }

    void print_arr(int *arr, int n){
        int i;
        for(i = 0,printf("\n"); i < n; printf("%d",arr[i++]));
    }

    void recn(int *arr, int n, int l) {
    int i, j, f, k, xx = 0;
    static int tst[15], a[14]={0};

    if (l == n) {
        for (i = 0; i < n; i++) {
            tst[i] = arr[a[i]];
        }
        print_arr(tst,n);
        return;
    }
    for (i = 0; i < n; i++) {
        f = 0;
        for (j = 0; j < l; j++)
            if (a[j] == i)
                f = 1;

        if (!f) {
            a[l] = i;
            recn(arr, n, l + 1);
        }
    }
}