首页 文章

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

提问于
浏览
2

我遇到的问题是这样的:

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

我想到的是你有一个阵列1,2,3

你会“留出”最后一个数字并置换这样留下的较小的一组:

  • 1 2 3

  • 2 1 3

  • 2 3

  • 1 3

  • 3

哪个是10 * [烫发(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 回答

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

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

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

相关问题