簡體   English   中英

編寫迭代函數來計算數學序列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM