2012-11-29 29 views
0

我写了一个递归函数为我的功课要做以下计算:我的递归在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我很多东西。我会重新获得帮助。谢谢:)

+0

您的基本情况在哪里? – Maroun

+0

你的意思是我的主要条件是终止递归?如果是这样,它应该是行: 如果(mezi [1]> 3){ –

+1

但在里面'如果'你不终止递归.. – Maroun

回答

0

你的程序逻辑有很多问题。

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; } //This is a redundant test and 
     //initialization. i == 3 is true only in the first run of the loop. These 
     //initialization should be done in the loop itself 

     if (prize < minih) { mini = i; minih = prize; } 

     if (mezi[1] > 3){ //This is also redundant as mezi[3] is always greater than 3 
     // otherwise the loop wont run as you check for this in your test expression 

      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; 

     //The only base case test you have is mezi[1]<3 which you should make sure is 
     // present in your data set 

     findmin(help,help); 
    } 
    prizemin = help[0]; 

    return prizemin; 
}