我写了一个递归函数为我的功课要做以下计算:我的递归在C中出了什么问题?
对于开关输入:
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
是intercalculation阵列,我用它来存储在递归得到了新的价值。
int *help;
的*mezi
是动态alocated阵列定义为:
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不久前和递归函数cofuse我很多东西。我会重新获得帮助。谢谢:)
您的基本情况在哪里? – Maroun
你的意思是我的主要条件是终止递归?如果是这样,它应该是行: 如果(mezi [1]> 3){ –
但在里面'如果'你不终止递归.. – Maroun