2016-12-23 6 views
1

Я реализовал, чтобы найти максимальное значение в списке. Я знаю, что в Scala вам не нужно использовать «return», просто отбросьте его. Так что я написал, как это,Как функция возврата Scala

def max(xs: List[Int]):Int={ 
    if(xs.isEmpty) throw new java.util.NoSuchElementException 
    def f(cur_max:Int, xs:List[Int]):Int={ 
    if(xs.isEmpty) 
     cur_max // <- it doesn't return value but just keep going below code. 
    if(cur_max < xs.head) 
     f(xs.head,xs.tail) 
    else 
     f(cur_max,xs.tail) 
    } 
    f(xs.head,xs) 
} 

Когда пройден до конца списка, он должен быть возвращен cur_max значения.
Однако он просто продолжает двигаться. Почему он не возвращает cur_max.
Чтобы исправить эту проблему, я добавляю выражение 'return', которое Scala не рекомендует ('return cur_max').

+0

Должен ли второй, если блок быть else-if, а не только отдельный блок if? –

ответ

2

В Scala недостаточно просто сбросить значение - метод возвращает последний обработанный оператор. В вашем случае у вас есть два заявления:

if(xs.isEmpty) 
    cur_max 

и

if(cur_max < xs.head) 
    f(xs.head,xs.tail) 
else 
    f(cur_max,xs.tail) 

Таким образом, результат второго выражения один получает возвращается. Чтобы исправить это добавить еще заявление:

if(xs.isEmpty) 
    cur_max 
else if(cur_max < xs.head) 
    f(xs.head,xs.tail) 
else 
    f(cur_max,xs.tail) 
0

сделал несколько изменений. некоторые из них просто стиль кода, чтобы быть более читаемым, например, иметь скобки по выражениям if.

def max(xs: List[Int]): Int = { 

     def f(cur_max: Int, xs: List[Int]): Int = { 
      if (xs.isEmpty) { 
      cur_max // <- it doesn't return value but just keep going below code. 
      } else { 
      if (cur_max < xs.head) { 
       f(xs.head, xs.tail) 
      } 
      else { 
       f(cur_max, xs.tail) 
      } 
      } 
     } 

     if (xs.isEmpty) { 
      throw new java.util.NoSuchElementException 
     } else { 
      f(xs.head, xs.tail) 
     } 

     } 

в основном есть некоторые случаи на вашей внутренней функции, которую вы назвали f:

  • список пуст -> вы должны вернуть текущее значение максимального
  • список не пуст и текущий макс меньше, чем первый элемент оставшегося списка -> обновить текущий макс и вызвать функцию с хвостом списка
  • список не пуст И текущий максимальный> = чем первый элемент из оставшегося списка -> Звоните весело с хвостом списка и тем же максимальным током
Смежные вопросы