Re: [問題] 請問這樣的程式要怎麼改成遞迴

看板C_and_CPP作者 (喲)時間13年前 (2011/07/06 23:13), 編輯推噓1(106)
留言7則, 4人參與, 最新討論串2/3 (看更多)
※ 引述《poiuy777 (帥氣又拉風)》之銘言: : 以下是我已經寫好的 但是有一行我怎麼塞就是塞不進去(if之後的那行) : 希望有人可以幫幫我 : #include <stdlib.h> : #include <iostream.h> : #include <math.h> : double test1(double x){ : double err = 2^10, tim = 1, a = zeros(1,x); : while (a[0] < err - sizeof a/sizeof a[0] + 1) { : for (i = (length(a)-1; i<=2; i--) { : if a[i] > err : a[i-1] = a[i-1] + 1; : a[i] = a[i] + 1; : } : % ???????????????????????????????????????? : } 應該是: for (i = length(a)-1; i> 0; i--) { a[i] = a[i] + 1; if (a[i] > err) { a[i-1] = a[i-1] + 1; a[i] = a[i-1] + 1; } } //Update:但經kinglord提醒,這樣改寫不對. stateful果然很煩人. //Update: 這一段程式應該寫成以下這樣: // for (i = length(a)-2, a[i+1] = a[i+1] + 1; // (i > 0 && a[i] > err) || i == 0; // i--) // { // a[i] = a[i] + 1; // } // for (i = 0; i < length(a)-1; i++) { // if (a[i] <= err+1) continue; // a[i+1] = a[i] + 1; // } : tim = tim + 1; : } : cout << tim; : } : 那行不能放在if內 但我也不知道該放哪 : 在這先謝謝各位了 至於你說的遞迴,大概是這樣: 整個while是一個狀態機,走到最後一步產生tim值. 所以: main() { double err = pow(2, 10); double a[4] = {0, 0, 0, 0}; long tim = 0; int len = sizeof a / sizeof a[0]; int count(double a[], int len, double err, long tim); tim = count(a, len, err, 0); cout << tim; system("pause"); } int count(double a[], int len, double err, long tim) { int i; void m_arr(double& a[], int len, int index); if (a[0] >= err - len + 1) return tim; m_arr(a, len, len-1); return count(a, len, err, tim+1); } void m_arr(double& a[], int len, int index) { if (index < 1) { a[0] = a[0] + 1; return; } a[index] = a[index] + 1; if (a[index] > err) { m_arr(a, len, index-1); a[index] = a[index-1] + 1; } return; } a[]的數目傳遞過程的確是遞迴,原po你雖然沒把迴圈拉出來, 但是有感覺到那個遞迴結構,很厲害唷,很有潛力! -- /yau -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 59.112.224.234

07/06 23:16, , 1F
少了return count(...);
07/06 23:16, 1F
※ 編輯: yauhh 來自: 59.112.224.234 (07/06 23:17) ※ 編輯: yauhh 來自: 59.112.224.234 (07/06 23:18)

07/06 23:18, , 2F
Right. 謝謝.
07/06 23:18, 2F

07/06 23:21, , 3F
迴圈也錯了 沒達到門檻要跳出 a[i-1]=a[i-1]+1要刪掉
07/06 23:21, 3F

07/06 23:24, , 4F
嗯,不該這樣寫,因為條件條件,最好把條件收掉迴圈中
07/06 23:24, 4F

07/06 23:30, , 5F
阿 又說錯了 應該是i==1時 才執行a[i-1]=a[i-1]+1;
07/06 23:30, 5F

07/06 23:32, , 6F
對啊,不是只刪a[i-1]=a[i-1]就搞定的
07/06 23:32, 6F
※ 編輯: yauhh 來自: 59.112.224.234 (07/06 23:47) ※ 編輯: yauhh 來自: 59.112.224.234 (07/07 00:18) ※ 編輯: yauhh 來自: 59.112.224.234 (07/07 00:21)

07/07 00:31, , 7F
謝謝您
07/07 00:31, 7F
※ 編輯: yauhh 來自: 59.112.224.234 (07/07 09:27)
文章代碼(AID): #1E57kBfx (C_and_CPP)
文章代碼(AID): #1E57kBfx (C_and_CPP)