[英]write iterative function to calculate a mathematics sequence
對於作業,我需要編寫兩個函數來計算相同的數學序列,遞歸和迭代版本。 遞歸版編程成功,但是不知道迭代版怎么實現。
(這是我第一次用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。
另外,根據我的教授的說法,代碼必須足夠優化(時間復雜度?)並且沒有明顯的語義問題(太容易發現)。
你能幫我實現迭代版本的任何建議嗎?
所以,如果這個問題已經被問到,對不起,你能給我鏈接嗎?
否則我感謝你的時間,
真摯地。
我弄出來了,顯然是分數色數列。
#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
您的遞歸以解構方式工作,從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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.