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

看板C_and_CPP作者 (帥氣又拉風)時間13年前 (2011/07/06 21:52), 編輯推噓2(2028)
留言30則, 6人參與, 最新討論串1/3 (看更多)
開發平台(Platform):Dev C++ 原程式為 #include <stdlib.h> #include <iostream.h> #include <math.h> main(){ double err = pow(2,10); //一個限值 double a[4] = {0, 0, 0, 0}; //代表有1~4 四個變數 double tim = 0; //計數器 while (a[0] < err - sizeof a/sizeof a[0] + 1) { a[3] = a[3] + 1; if (a[3] > err){ a[2] = a[2] + 1; if (a[2] > err){ a[1] = a[1] + 1; if (a[1] > err){ a[0] = a[0] + 1; a[1] = a[0] + 1; } a[2] = a[1] + 1; } a[3] = a[2] + 1; } tim = tim + 1; } cout << tim; system("pause"); } 現在a變數只有4個 但當要計算的a變數數量增加時 if判斷式也會往中間不斷增加 最後a變數可能要增加到100個左右 即1:100 用if寫可能會寫到天荒地老 現在卡在不知道如何把if寫成for迴圈 以下是我已經寫好的 但是有一行我怎麼塞就是塞不進去(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; } % ???????????????????????????????????????? } tim = tim + 1; } cout << tim; } 那行不能放在if內 但我也不知道該放哪 在這先謝謝各位了 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 122.116.237.166

07/06 21:54, , 1F
我想問你這個程式的邏輯是什麼?
07/06 21:54, 1F
一個累加器 當a[3]超過一個門檻時 a[2]會加1 但a[3]不是歸零 是從a[2]+1開始算 a[2]a[1]與a[1]a[0]之間的關係依此類推 我的目地是要推算出當a值有幾個時 另一支程式大約要執行多久

07/06 22:01, , 2F
用vector???不過這到底是要做甚麼的???
07/06 22:01, 2F

07/06 22:03, , 3F
標題寫遞迴 裡面卻在問迴圈?
07/06 22:03, 3F
我是覺得這有點像遞迴 好像用迴圈寫不出來 也可能是我改的方式根本是錯的 也請各位不令賜教 謝謝各位了 ※ 編輯: poiuy777 來自: 122.116.237.166 (07/06 22:27)

07/06 22:33, , 4F
1.照你說的邏輯 你第一個程式在a[1]>err那邊有錯
07/06 22:33, 4F

07/06 22:34, , 5F
2.第2個程式一堆括號標錯 然後????不知道你說哪行
07/06 22:34, 5F

07/06 22:35, , 6F
我是假設你是要問i=1時怎麼處理來回答
07/06 22:35, 6F

07/06 22:35, , 7F
從原程式來看要改遞迴是還好...
07/06 22:35, 7F

07/06 22:38, , 8F
所以是要問遞迴阿 還以為是改迴圈錯誤的地方
07/06 22:38, 8F

07/06 22:38, , 9F
會用return就可以解決了...
07/06 22:38, 9F

07/06 22:43, , 10F
為什麼要用double 宣告a = =...
07/06 22:43, 10F

07/06 22:45, , 11F
如果是迴圈,是這個意思嗎???
07/06 22:45, 11F

07/06 22:46, , 12F

07/06 22:48, , 13F
tim=tim+1;照第一個程式來講 要放在for外面才對
07/06 22:48, 13F

07/06 22:49, , 14F
是以第一段code之邏輯為目標,換個較易維護的架構是嗎?
07/06 22:49, 14F

07/06 22:49, , 15F
原code a[0] 與a[1]似乎沒關係 = =...
07/06 22:49, 15F

07/06 22:50, , 16F
if之前也少了a[i]=a[i]+1;
07/06 22:50, 16F

07/06 22:51, , 17F
@kinglord: 似乎沒差,因為都得離開for迴圈
07/06 22:51, 17F

07/06 22:51, , 18F
原CODE我猜寫錯了 照原PO說的邏輯 a[1]=a[0]+1;
07/06 22:51, 18F
不好意思 是我筆誤 因為我是從matlab轉過來的 一個起頭是1一個起頭是0 抱歉

07/06 22:51, , 19F
我覺得 tim 用 unsigned long long 會好點耶..
07/06 22:51, 19F

07/06 22:52, , 20F
恩恩 沒差 我沒注意到 謝謝提醒
07/06 22:52, 20F

07/06 22:53, , 21F
http://codepad.org/lakYJKaj 遞迴就這樣而已...
07/06 22:53, 21F
謝謝f大 我努力拜讀一下您的程式 ※ 編輯: poiuy777 來自: 122.116.237.166 (07/06 22:59)

07/06 22:57, , 22F
07/06 22:57, 22F
※ 編輯: poiuy777 來自: 122.116.237.166 (07/06 22:59)

07/06 23:00, , 23F
@tjjh89017:2^10是哪招....
07/06 23:00, 23F

07/06 23:03, , 24F
我想只是照原PO寫的直接COPY而已吧 虛擬碼0.0
07/06 23:03, 24F

07/06 23:04, , 25F
@tjjh89017:之前說錯 應該是a[i-1]=a[i-1]+1要提出if外面
07/06 23:04, 25F

07/06 23:05, , 26F
成為a[i]=a[i]+1才對 抱歉= =
07/06 23:05, 26F

07/06 23:05, , 27F
什麼時候C/C++變得這麼先進了...
07/06 23:05, 27F

07/06 23:12, , 28F
喔不~~ 小錯誤 if裡的別+1
07/06 23:12, 28F

07/06 23:31, , 29F
07/06 23:31, 29F
再次謝謝f大 但是剛剛test一下 輸出似乎與原程式不同 http://codepad.org/44car4Ue 不過我會試著往這個方向去修改的 謝謝 經過一夜的折騰 遞迴真的不是像我一樣的一般人寫得出來的 也見識到了C版大家的熱情 謝謝各位的指導 ※ 編輯: poiuy777 來自: 122.116.237.166 (07/07 00:32)

07/07 00:33, , 30F
大概是a[0]的問題 if(!num)return (a[0]++)+1;
07/07 00:33, 30F
文章代碼(AID): #1E56YhhP (C_and_CPP)
文章代碼(AID): #1E56YhhP (C_and_CPP)