對于作業,我需要撰寫兩個函式來計算相同的數學序列,遞回和迭代版本。遞回版編程成功,但是不知道迭代版怎么實作。
(這是我第一次用C語言編程。)
遞回版本:
float sequence(int n)
{
float x = 1.0;
if(n>=1)
{
float temp = sequence(n-1);
x = temp 1/temp;
}
return x;
}
如果代碼有效,我必須找到sequence(0) = 1, sequence(1) = 2, sequence(3) = 2.5, sequence(4) = 2.9,..., sequence(100) ~ 14.284066。
另外,根據我的教授的說法,代碼必須足夠優化(時間復雜度?)并且沒有明顯的語意問題(太容易發現)。
你能幫我實作迭代版本的任何建議嗎?
所以,如果這個問題已經被問到,對不起,你能給我鏈接嗎?
否則我感謝你的時間,
真摯地。
uj5u.com熱心網友回復:
我弄出來了,顯然是分數色數列。
#include <stdio.h>
double seqrec(unsigned n) {
if (n < 2) return 1;
double prev = seqrec(n - 1);
return prev 1 / prev;
}
double seqiter(unsigned n) {
double numerator = 1, denominator = 1;
for (unsigned k = 2; k <= n; k ) {
double newnumerator = numerator*numerator denominator*denominator;
denominator = numerator*denominator;
numerator = newnumerator;
// avoid nan, get numbers down to a reasonable level :-)
while (denominator > 2) {
numerator /= 2;
denominator /= 2;
}
}
return numerator / denominator;
}
int main(void) {
for (int k = 1; k < 49; k ) {
printf("%d ==> %f, %f\n", k, seqrec(k), seqiter(k));
}
}
具有以下輸出
1 ==> 1.000000, 1.000000 2 ==> 2.000000, 2.000000 3 ==> 2.500000, 2.500000 4 ==> 2.900000, 2.900000 5 ==> 3.244828, 3.244828 6 ==> 3.553010, 3.553010 7 ==> 3.834462, 3.834462 8 ==> 4.095255, 4.095255 9 ==> 4.339440、4.339440 10 ==> 4.569884, 4.569884 11 ==> 4.788708, 4.788708 12 ==> 4.997533、4.997533 13 ==> 5.197631、5.197631 14 ==> 5.390027, 5.390027 15 ==> 5.575555, 5.575555 16 ==> 5.754909, 5.754909 17 ==> 5.928674, 5.928674 18 ==> 6.097345, 6.097345 19 ==> 6.261351, 6.261351 20 ==> 6.421061, 6.421061 21 ==> 6.576799, 6.576799 22 ==> 6.728848, 6.728848 23 ==> 6.877462, 6.877462 24 ==> 7.022865, 7.022865 25 ==> 7.165257, 7.165257 26 ==> 7.304819, 7.304819 27 ==> 7.441715, 7.441715 28 ==> 7.576093, 7.576093 29 ==> 7.708087, 7.708087 30 ==> 7.837821, 7.837821 31 ==> 7.965407、7.965407 32 ==> 8.090950, 8.090950 33 ==> 8.214545, 8.214545 34 ==> 8.336280, 8.336280 35 ==> 8.456238, 8.456238 36 ==> 8.574494, 8.574494 37 ==> 8.691119, 8.691119 38 ==> 8.806179, 8.806179 39 ==> 8.919735, 8.919735 40 ==> 9.031846, 9.031846 41 ==> 9.142565, 9.142565 42 ==> 9.251944, 9.251944 43 ==> 9.360029, 9.360029 44 ==> 9.466867、9.466867 45 ==> 9.572498, 9.572498 46 ==> 9.676964, 9.676964 47 ==> 9.780302, 9.780302 48 ==> 9.882549, 9.882549
uj5u.com熱心網友回復:
您的遞回以解構方式作業,從n遞回呼叫開始并向后作業,直到達到基本情況。對于基本情況,它回傳已知答案,并在基本情況之上的每個級別使用回傳的結果評估方程。
對于迭代,您希望從基本案例到n. 在每次迭代中,當前值用于更新前一次迭代的結果。
您使用了pseudocode標簽,所以我在 Ruby 中提供了它(實際上是偽代碼,但可以運行以檢查答案)。您可以自己將其翻譯成 C 以加強您的理解。
def recursive(n)
return 1.0 if n < 2
x = recursive(n - 1)
return x 1 / x
end
def iterative(n)
x = 1.0
n.times { x = 1.0 / x }
return x
end
我已經測驗過了,它們都回傳相同的答案,n最多 1000
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/335232.html
上一篇:C中“if”陳述句中的分段錯誤
