1
我正在從Java遷移到Scala,我正在嘗試爲mergesort算法提供合併過程。我的解決辦法:在scala中mergesort的合併
def merge(src: Array[Int], dst: Array[Int], from: Int,
mid: Int, until: Int): Unit = {
/*
* Iteration of merge:
* i - index of src[from, mid)
* j - index of src[mid, until)
* k - index of dst[from, until)
*/
@tailrec
def loop(i: Int, j: Int, k: Int): Unit = {
if (k >= until) {
// end of recursive calls
} else if (i >= mid) {
dst(k) = src(j)
loop(i, j + 1, k + 1)
} else if (j >= until) {
dst(k) = src(j)
loop(i + 1, j, k + 1)
} else if (src(i) <= src(j)) {
dst(k) = src(i);
loop(i + 1, j, k + 1)
} else {
dst(k) = src(j)
loop(i, j + 1, k + 1)
}
}
loop(from, mid, from)
}
似乎工作,但在我看來,這是寫在相當「勢在必行」的風格 (儘管我已經使用遞歸,也沒有可變的變量除了陣列,用於其副作用打算)。我想是這樣的:
/*
* this code is not working and at all does the wrong things
*/
for (i <- (from until mid); j <- (mid until until);
k <- (from until until) if <???>) yield dst(k) = src(<???>)
但我想出了這樣那樣的妥善解決CANT。你能幫我麼?
也許你的問題屬於上http://codereview.stackexchange.com/ .. – meucaa
@meucaa潛在的,但目前還沒有寫入。代碼評審問題的形式是「這是X的代碼,它怎麼能做得更好」而不是「這是X的代碼,我怎麼才能讓它做Y代替」。如果OP放棄了他們問題的第二部分,那麼它將非常適合CR。 – Kaz
@扎克實際上我問的是如何做得更好,我不希望代碼做任何事情而不是合併。 –