递归:求出给定数字数组的所有可能k-排列的总和

时间:2015-04-13 22:33:23

标签: c recursion sum permutation

我遇到的问题是:

对于给定的不同小数位数组(0,1,2,3 ...,8,9),写一个递归函数,返回由给定数字组成的所有自然数的和。例如。对于数组{1,2},你会得到12 + 21 + 2 + 1 = 36

我想到的是你有一个数组1,2,3

你会"搁置"最后一个数字,并将这样留下的小集合置换:

  1. 1 2 3
  2. 2 1 3
  3. 2 3
  4. 1 3
  5. 3
  6. 其中10 * [perm(1,2)] + 3 *(重复次数)

    这是我在c:

    中的代码
    #include <stdio.h>
    #include <stdlib.h>
    
    void swap(int *a,int *b)
    {
    int *temp=a;
        *a=*b;
        *b=*temp;
    }
    
    int rek(int n[], int d,int sum,int cnt)
    {   cnt++;
    if(d==0){return n[d];}
    int i;
    for(i=d;i>=0;i--)
    {
        swap(&n[i],&n[d]);
        sum+=10+rek(n,d-1,sum,0)+n[d]*cnt;
        swap(&n[i],&n[d]);
    }
    return sum;
    }
    
    
    int main()
    {
    int a[9],k,i,s=0,error=0;
    scanf("%d",&k);
    for(i=0;i<k;i++)
    {
        scanf("%d",&a[i]);
        if(i){if(a[i]==a[i-1]){error=1;} }
    }
    if(error){printf("Error!"); return 0;}
    
    s+=rek(a,k-1,s,0);
    
    printf("%d",s);
    
    return 0;
    }
    

    看来我的交换不起作用,我也不知道为什么。我在rek函数中打印了数组,对于输入{1,2},它应该是{1,2}另一次{2,1}但是我得到{1,2}然后是{2,2}。我环顾四周,但我唯一能找到的是总和到一定数量的所有可能组合的总和。我知道这可以通过一些组合公式进行递归,但我对递归版本感兴趣。

1 个答案:

答案 0 :(得分:1)

void swap(int *a,int *b)
{
int *temp=a;
    *a=*b;
    *b=*temp;
}

这会将指针a存储在temp中,将值设置为a ,然后读取 temp处的值。它仍然指向同一个地方,现在它有一个新的价值。您需要将值本身存储在临时变量中:

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}