选择排序 - 具有递归的功能样式

时间:2016-04-17 11:21:05

标签: scala functional-programming selection-sort

最近刚开始学习Scala,我正在尝试深入研究功能编程。我看过许多有关Selection Sort Functional风格的帖子;但我完全不能理解已经给出的所有解决方案。我的Scala技能仍然是新生的。

我使用尾递归编写了一段Scala代码,并希望对样式有任何反馈。它看起来像功能编程吗?有没有办法让这更好或使其更具功能性?

public boolean onMarkerClick(Marker marker1) {
        if(this.marker1.equals(marker1)){
        AlertDialog.Builder alertadd = new AlertDialog.Builder(MyClass.this);
        LayoutInflater factory = LayoutInflater.from(MyClass.this);
        final View view = factory.inflate(R.layout.dialog_layout, null);
        alertadd.setView(view);
        alertadd.show();
        return true;
      }
      return false;
    }

我试图采用的逻辑非常简单。我从数组的第一个索引开始,找到其余的最小值。但不是传递Array.tai​​l进行下一次递归;我传入完整数组并检查切片,其中每个切片比前一个递归切片小一个。

例如, 如果是数组(10,4,6,9,3,5) 第一遍 - > head = 10,slice = 4,6,9,3,5 第一遍 - > head = 4,slice = 6,9,3,5

我觉得它看起来像传递尾巴一样,但我想尝试切片,看它是否以同样的方式工作。

感谢您的帮助。

1 个答案:

答案 0 :(得分:4)

有关工作代码的详细反馈,最好转到codereview;但是,我可以说一件事:即就地排序数组本身不是函数式编程的一个很好的例子。这是因为我们纯粹主义者不喜欢可变性,因为它与数据的递归不能很好地结合在一起 - 特别是你对递归和变异的混合并不是真正好的风格,我会说(并且难以阅读)。 / p>

一个干净的变体是复制完整的原始数组,并使用就地选择排序实现为普通的命令式代码(带循环和就地交换)。封装在一个函数中,这对外部是纯粹的。这种模式通常用于标准库中;比照List.scala

另一个变体,可能对学习不可变编程更有启发性,就是在链表上使用不可变递归算法:

def sorted(a: List[Int]): List[Int] = a match {
  case Nil => Nil
  case xs => xs.min :: sorted(xs.diff(List(xs.min)))
}

从这种编程风格,你将学到更多关于功能性思维的知识(尽管不考虑效率)。练习:将该代码转换为尾递归。

(实际上,插入排序对这种模式更有效,因为你不必在每一步都“删除”,但可以建立一个有序的链表;你也可以尝试实现它。) p>