我遇到的问题是:
对于给定的不同小数位数组(0,1,2,3 ...,8,9),写一个递归函数,返回由给定数字组成的所有自然数的和。例如。对于数组{1,2},你会得到12 + 21 + 2 + 1 = 36
我想到的是你有一个数组1,2,3
你会"搁置"最后一个数字,并将这样留下的小集合置换:
其中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}。我环顾四周,但我唯一能找到的是总和到一定数量的所有可能组合的总和。我知道这可以通过一些组合公式进行递归,但我对递归版本感兴趣。
答案 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;
}