Scalaの学習を始めたばかりで、Functional Programmingを掘り下げようとしています。私はSelection Sort Functionalスタイルの記事の多くを見てきました。与えられたすべての解決策を完全に理解することはできませんでした。私のScalaのスキルはまだNascentです。選択ソート - 再帰を伴う機能的スタイル
私は末尾再帰を使用してScalaコードを書いており、そのスタイルに関するフィードバックをいただければ幸いです。 Functional Programmingのように見えますか?これを改善したり、より機能的にする方法はありますか?
import scala.annotation.tailrec
object FuncSelectionSort {
/**
* Selection Sort - Trying Functional Style
*/
def sort(a: Array[Int]) = {
val b: Array[Int] = new Array[Int](a.size)
Array.copy(a, 0, b, 0, a.size)
// Function to swap elements
def exchange(i: Int, j: Int): Unit = {
val k = b(i);
b(i) = b(j);
b(j) = k;
}
@tailrec
def helper(b: Array[Int], n: Int): Array[Int] = {
if (n == b.length-1) return b
else {
val head = b(n);
val minimumInTail = b.slice(n, b.length).min;
if (head > minimumInTail) {
val minimumInTailIndex = b.slice(n, b.length).indexOf(minimumInTail);
exchange(n, minimumInTailIndex + n);
}
helper(b, n + 1)
}
}
helper(b, 0)
}
}
私が採用しようとしているロジックはかなり単純です。配列の最初のインデックスから始め、残りの配列の最小値を求めます。しかし、次の再帰のためにArray.tailを渡すのではなく、私は完全な配列を渡し、各スライスが前の再帰スライスよりも小さいスライスをチェックします。
例えば、 場合、配列(10、4、6、9、3、5) 最初のパス - >ヘッド= 10、スライス= 4,6,9,3,5 最初のパス - >ヘッド= 4、slice = 6,9,3,5
私は尾を通過するのと同じように感じますが、同じ方法でスライスして見たいと思っていました。
あなたのお手伝いをお待ちしております。
この投稿はプログラミング上の問題ではなく、コードレビューのリクエストを含んでいます。それはより適切ですhttp://codereview.stackexchange.com/ – Odomontois
さて、あなたは配列を突然変異させるので、それは定義上 "機能的"ではなく、少なくとも "純粋な"ものではありません。 –
フィードバックいただきありがとうございます。私はあなたが機能していないということを理解しています。機能的ではなかったし、まだそれを掛けている。 – Keb