目標是將此總和編碼為遞回函式。 和
到目前為止,我已經嘗試過像這樣編碼。
def under(u: Int): Int = {
var i1 = u/2
var i = i1 1
if ( u/2 == 1 ) then u 1 - 2 * 1
else (u 1 - 2 * i) under(u-1)
}
似乎我遇到了遞回部分的問題,但我無法弄清楚出了什么問題。理論上,under(5)應該產生10個。
uj5u.com熱心網友回復:
你的邏輯是錯誤的。它應該從i=1to迭代(無論是通過回圈、遞回還是集合都無關緊要)i=n/2。但是按原樣使用n和當前i。
(1 to (n/2)).map(i => n 1 - 2 * i).sum
您(或多或少)正在運行從i=1to i=n(或更確切地說是 n 到 1)的計算,而不是n使用i/2and 而不是i使用i/2 1. (總和從 i=1 到 i=n of (n/2 1 - 2 * i))。
// actually what you do is more like (1 to n).toList.reverse
// rather than (1 to n)
(1 to n).map(i => i/2 1 - 2 * (i/2 1)).sum
這是一個不同的公式。它有兩倍的元素要求和,每個元素的一部分正在變化而不是保持不變,而另一部分具有錯誤的值。
要使用遞回實作相同的邏輯,您必須執行以下操作:
// as one function with default args
// tail recursive version
def under(n: Int, i: Int = 1, sum: Int = 0): Int =
if (i > n/2) sum
else under(n, i 1, sum (n 2 - 2 * i))
// not tail recursive
def under(n: Int, i: Int = 1): Int =
if (i > n/2) 0
else (n 2 - 2 * i) under(n, i 1)
// with nested functions without default args
def under(n: Int): Int = {
// tail recursive
def helper(i: Int, sum: Int): Int =
if (i > n/2) sum
else helper(i 1, sum (n 2 - 2 * i))
helper(1, 0)
}
def under(n: Int): Int = {
// not tail recursive
def helper(i: Int): Int =
if (i > n/2) 0
else (n 2 - 2 * i) helper(i 1)
helper(1)
}
uj5u.com熱心網友回復:
附帶說明:根本不需要使用任何迭代/遞回。這是一個明確的公式:
def g(n: Int) = n / 2 * (n - n / 2)
給出相同的結果
def h(n: Int) = (1 to n / 2).map(i => n 1 - 2 * i).sum
兩者都假設您想n / 2在n奇數的情況下下底,即上面的兩個函式的行為都與
def j(n: Int) = (math.ceil(n / 2.0) * math.floor(n / 2.0)).toInt
(至少在出現舍入錯誤之前)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/350154.html
