2012-11-29 62 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; 
}