我为我的作业编写了一个递归函数来进行以下计算:
对于输入:
1 2 3 4
它应该这样做:
((1*3)+2) + ((1*4)+3) = 13
, 小于, ((2*4)+3) + ((1*4)+2) = 17
, 所以它返回 13。用字母它应该做这个计算:((A*C)+B) + ((A*D)+C)
并将它与其他选项进行比较, 在这种情况下有 2 个选项: ((B*D)+C) + ((A*D)+C)
。
几句话。数字表示段每一端的“螺钉”数量。该段始终由 2 个数字组成。分段 A {1 2}、B {2 3}、C {3 4}。
任务是加入所有 N 个段。我必须找到“最便宜”的方法来做到这一点。每次我加入两个部分(例如 A 和 B)时,我都会这样做:
A 的“底部螺钉”(1 - 第一个数字)* B 的“顶部螺钉”(3 - 第三个数字)+“连接螺钉”(2 - 之间的数字)。
我必须按顺序加入它们,它总是必须以 ABCD 顺序结束。但我可以选择从哪里开始。我可以加入 A 到 B,然后 AB 到 C,或者我可以加入 B 到 C,然后 A 到 BC。基本上在其中一种情况下,“成本”将是最低的,这就是要返回的价值。
现在我已经这样做了,但我很困惑:
这*help
是一个相互计算数组,我用它来存储递归中得到的新值。
int *help;
这*mezi
是一个动态分配的数组,定义为:
int *mezi;
里面看起来像{0,4,1,2,3,4,-1}
。
mezi[0] = here is stored the total prize in the recursion.
mezi[1] = here is stored the number of values in the array, 4 for 4 values (3 segments).
mezi[n+2] = the last number (-1), its just an identifier to find out the number of values.
这是我的代码:
int findmin(int *mezi, int *pomocny)
{
int i,j,k;
int prize, prizemin, mini, minih;
for (i=3;i<mezi[1];i++) {
prize = mezi[i-1] * mezi[i+1] + mezi[i];
if (i==3) { mini = i; minih = prize; }
if (prize < minih) { mini = i; minih = prize; }
if (mezi[1] > 3){
k=2;
for (j=2;j<mezi[1];j++) {
if (j != mini) help[k] = mezi[j];
k++;
}
help[1] = (mezi[1]-1);
}
help[0] += prize;
findmin(help,help);
}
prizemin = help[0];
return prizemin;
}
我是个新手,不久前我开始使用 C,递归函数让我很困惑。我会感谢您的帮助。谢谢 :)