-1

配列の最上位要素を出力する再帰関数を作成しようとしています。

;前後が必要だと言っelse maxi=xs.head}いるmax(xs.tail)

scala がセミコロンを使用するとは思いませんでした。いつ使用する必要があり、その他の基本的な構文規則は何ですか。

var maxi = 0 
def max(xs: List[Int]): Int = {if (xs.isEmpty) throw new java.util.NoSuchElementException() 
      else if (xs.tail.isEmpty) maxi
      else if (xs.tail.head > xs.head) maxi = xs.tail.head
      max(xs.tail)
      else maxi=xs.head
      max(xs.tail)
}
4

6 に答える 6

9

これは宿題のように見えます。これは、これが Odersky のオンライン Coursera コースの最初の宿題の一部であるという事実のみに基づいています。

そうでない場合はお知らせください。ただし、そうであると仮定しますので、ヒントを与えます..if/elseブランチがどのように構成されているかを見てください。

コースの最初の週のビデオでは、Scala のセミコロン推論について説明します。

于 2012-09-20T03:03:55.717 に答える
6

適切な書式を設定すると、問題が表示されます。

var maxi = 0 
def max(xs: List[Int]): Int = {
  if (xs.isEmpty) 
    throw new java.util.NoSuchElementException() 
  else if(xs.tail.isEmpty) 
    maxi
  else if(xs.tail.head > xs.head) { // <-- need this opening brace
    maxi = xs.tail.head             // because there are two lines 
    max(xs.tail)                    // in the body of the if-statement
  }                                 // <-- and this closing brace
  else {
    maxi=xs.head
    max(xs.tail)
  }
}

セミコロンは Scala コードでは有効ですが、Java ほど必須ではありません。つまり、それらを必要としないコードを記述したり、必要に応じて特定の用途に使用したりできます。

于 2012-09-20T03:04:28.647 に答える
4

Scala はセミコロンを使用しますが、行末では省略可能です。つまり、セミコロンが行末で有効な場合 (つまり、行が式の途中で終わらない場合 ( などa +))、セミコロンが自動的に挿入されます。

とはいえ、エラー メッセージにもかかわらず、問題は実際にはセミコロンとは何の関係もありません。問題は、if ブロックまたは else ブロックに複数の式を含める場合は、中括弧が必要なことです。

PS: 変更可能な非ローカル変数を使用して状態を追跡することは、設計上は悪い考えであり、メソッドを複数回呼び出すと問題が発生することに注意してください (間に変数をリセットせずに)。

xs.tailPPS:が空のときに何をするかを注意深く確認する必要があります。ロジックが正しいと確信していますか?

于 2012-09-20T03:07:01.417 に答える
2

これは、Courseraの「Scalaを使用した関数型プログラミング」の宿題の例です。この種の質問のためのコースフォーラムがあります。

再帰を深く掘り下げて、追加の変数なしでこのタスクを解決する必要があります。リストソースには、ヘルパー関数に関するヒントがあります。これを使って。

于 2012-09-20T11:29:21.023 に答える
0
def max(xs: List[Int]): Int = {
  def maxNew(xs: List[Int], maxx: Int): Int ={
   if(xs.isEmpty) maxx else { 
     if (maxx<=xs.head) 
      maxNew(xs.tail, xs.head)
    else 
      maxNew(xs.tail, maxx)
   }
 }

  if(xs.isEmpty) throw new java.util.NoSuchElementException()
  else maxNew(xs,0)        
}
于 2016-10-28T10:33:12.663 に答える