我寫了一個遞歸函數爲我的功課要做以下計算:我的遞歸在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