当前位置: 首页 > 知识库问答 >
问题:

递归:求给定数字数组中所有可能k置换的和

房学文
2023-03-14

我遇到的问题如下:

对于给定的不同十进制数字数组(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

这将是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个答案

尹雅健
2023-03-14
void swap(int *a,int *b)
{
int *temp=a;
    *a=*b;
    *b=*temp;
}

这将指针存储在温度中,将值设置为a,然后读取温度值。它仍然指向相同的位置,现在有了新的值。您需要将值本身存储在临时变量中:

void swap(int *a, int *b)
{
    int temp = *a;
    *a = *b;
    *b = temp;
}
 类似资料:
  • 给定一个数组大小n和一个正数max(max表示我们可以用来放置在数组中的数字范围)。 我想计算我可以在数组中放置多少个排序数字的组合。 例如: 如果n=3,则最大值为2。(我们只能使用1/2的数字,因为最大值是2)因此有4种排序数组组合 我编写了一些代码,并成功地通过了这个特定的示例,但任何其他示例 我发现的问题是,当递归到达最后一个索引时,它不会尝试第三个数字,而是向后折叠。 我的代码:

  • 给定一个2d数组,我需要返回一个具有路径的矩阵,该路径递归地求和到给定的数字。 路径矩阵应为零,但总计为给定数字的路径除外,该路径将标记为1。 路径只能在 我尝试过所有的可能性,首先检查我是否已经去过下一个街区。 问题是在一些迭代之后,它会停止,并且不会返回并再次将块清除为0。 给定 在通话中 我以为算法会回来 我得到 相反 调用paintPath(mat1400,path,0,0);我想 或 问

  • 我被困在这个练习中。 任务: 数字根是数字中所有数字的递归和。给定n,取n的位数之和。如果该值有多个位数,则以这种方式继续减少,直到生成一个位数。这只适用于自然数。 其工作原理如下: 数字根(16) 1 6=7 数字根(942) 9 4 2=15。。。1 5 =6 我的方法在这里。关于如何正确返回正确值的任何提示?我将不胜感激。

  • 可能的子集:- 我只能想到一个朴素的算法,它列出集合的所有子集,并检查子集和是否>=k,但它是一个指数算法,列出所有子集需要O(2^n)。我能用动态规划在多项式时间内求解吗?

  • 我正在寻找以下问题的答案。 给定一组整数(无重复项)和一个和,找出集合元素的所有可能组合,并求和。解的顺序并不重要(解{2,2,3}和{3,2,2}是相等的)。 请注意,最终组合不需要是集合,因为它可以包含重复。 示例:集合{2,3,5}和10 结果:{2, 2, 2, 2, 2},{2,2,3,3},{2,3,5},{5,5} 我已经研究过子集和问题以及硬币兑换问题,但不能使它们适应我的需要。我

  • 问题内容: 我有一个我要为类创建的程序,该程序使用递归返回数组中所有整数的总和。到目前为止,这是我的程序: 但是,我相信我得到了三个都相关的错误,但是我不知道为什么它会找到一种null类型: 问题答案: 该解决方案比看起来简单,请尝试以下操作(假设数组的长度为非零): 这样称呼它: