你的循環正在計算算術級數的總和,也就是所謂的arithmetic series,從1開始, 1.在數學上的公差,進展是:
並且總和爲:
像你想計算的ñ(num
在你的代碼)所需的值預先指定的值的總和小號ñ(value
在你的代碼)這聽起來我。我們可以通過求解的上述總和方程來完成這個操作,即。
我們可以通過重新排列如下開始:
這是一個quadratic equation。堵到quadratic formula:
下面是一個使用R上述結果的演示。
首先,只是爲了演示的求和公式:
calcTotal <- function(num) num*(num+1L)/2L;
calcTotal(1:20);
## [1] 1 3 6 10 15 21 28 36 45 55 66 78 91 105 120 136 153 171 190 210
現在,這裏是我們如何能夠實現對ñ派生的解決方案。我寫了這個函數來產生一個矩陣,給出輸入S值在total
列下,然後接下來的兩列顯示了對於±運算的正和負選擇的派生公式的結果值。
calcNum <- function(total) cbind(total,matrix(rep(each=2L,sqrt(2*total+0.25))*c(1,-1)-0.5,ncol=2L,byrow=T,dimnames=list(NULL,c('+','-'))));
res <- calcNum(1:36);
res;
## total + -
## [1,] 1 1.000000 -2.000000
## [2,] 2 1.561553 -2.561553
## [3,] 3 2.000000 -3.000000
## [4,] 4 2.372281 -3.372281
## [5,] 5 2.701562 -3.701562
## [6,] 6 3.000000 -4.000000
## [7,] 7 3.274917 -4.274917
## [8,] 8 3.531129 -4.531129
## [9,] 9 3.772002 -4.772002
## [10,] 10 4.000000 -5.000000
## [11,] 11 4.216991 -5.216991
## [12,] 12 4.424429 -5.424429
## [13,] 13 4.623475 -5.623475
## [14,] 14 4.815073 -5.815073
## [15,] 15 5.000000 -6.000000
## [16,] 16 5.178908 -6.178908
## [17,] 17 5.352350 -6.352350
## [18,] 18 5.520797 -6.520797
## [19,] 19 5.684658 -6.684658
## [20,] 20 5.844289 -6.844289
## [21,] 21 6.000000 -7.000000
## [22,] 22 6.152067 -7.152067
## [23,] 23 6.300735 -7.300735
## [24,] 24 6.446222 -7.446222
## [25,] 25 6.588723 -7.588723
## [26,] 26 6.728416 -7.728416
## [27,] 27 6.865460 -7.865460
## [28,] 28 7.000000 -8.000000
## [29,] 29 7.132169 -8.132169
## [30,] 30 7.262087 -8.262087
## [31,] 31 7.389867 -8.389867
## [32,] 32 7.515610 -8.515610
## [33,] 33 7.639410 -8.639410
## [34,] 34 7.761356 -8.761356
## [35,] 35 7.881527 -8.881527
## [36,] 36 8.000000 -9.000000
首先,觀察減號的選擇總是導致負數。由於我們只對積極的結果感興趣,所以我們可以忽略該列。
其次,請注意加號的選擇總是會導致正數,但其中很多都是非整數。這是有道理的,因爲算術級數不落在所有可能的整數總和上。對於滿足進展整數基數的總數,該函數返回正確的積分結果。
我們可以子集出積分結果如下,使用自定義功能進行適當的浮點比較:
feq <- function(a,b,TOL=max(a,b)*1e-12) if (is.infinite(a) || is.infinite(b)) a==b else abs(a-b)<=TOL;
res[feq(res[,'+'],round(res[,'+'])),];
## total + -
## [1,] 1 1 -2
## [2,] 3 2 -3
## [3,] 6 3 -4
## [4,] 10 4 -5
## [5,] 15 5 -6
## [6,] 21 6 -7
## [7,] 28 7 -8
## [8,] 36 8 -9
現在,您的代碼示例中有確切的總數:
calcNum(30);
## total + -
## [1,] 30 7.262087 -8.262087
這意味着我們需要7.262087次循環迭代才能達到總值30.這當然是不可能的。
'1 + 2 + 3 + 4 + 5 + 6 + 7 = 28',和'1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 = 36' ,那麼這是如何工作的? – FrankerZ
我認爲你關注的是數字的價值,而不是我所說的,所以讓我用另一種方式來說。如何使num的值等於變量值,如果它已經循環了10次以上。無論值是30,50還是1000.我需要做什麼公式來使num值等於變量值,當它已被循環10次以上時 –
我認爲如果您給我們幾個例子,這會有所幫助。給我們一個函數輸入,以及它應該輸出的內容。 – FrankerZ