我遇到的问题是这样的:
对于给定的不同十进制数字(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 回答
这将把指针
a
存储在temp
中,将值设置为a
,然后读取temp
处的值 . 它仍然指向同一个地方,现在它有一个新的 Value . 您需要将值本身存储在临时变量中: