2016-01-25 3 views
0

Я пытаюсь выяснить, сходятся ли числа в списке Scala. Когда я запускаю свои тестовые примеры, консоль печатает произвольный список и никогда не завершается, заставляя меня думать, что он застрял в бесконечном цикле.Почему Scala 'match' застрял в цикле forever

Функция isDescending должна принимать список как параметр и должна возвращать логическое значение. Мы должны использовать рекурсию и не можем использовать функции из пакета коллекций.

Код:

def isDescending(lst: List[Int]): Boolean ={ 
    isDescendingHelper(lst, 0, true) 
    } 

    def isDescendingHelper(lst: List[Int], prev: Int, begin: Boolean): Boolean = { 
    lst match{ 
     case Nil => true 
     case head :: tail => { 
     if (begin){ 
      isDescendingHelper(lst, head, false) 
     } else if (head <= prev){ 
      isDescendingHelper(lst, head, false) 
     } else { 
      false 
     } 
     } 
    } 
    } 

Test Cases:

test("isDescending test case"){ 
    assert(isDescending(List())) 
    assert(isDescending(List(0, 0, 0))) 
    assert(isDescending(List(3, 6, 8))) 
    assert(isDescending(List(3, 6, 8 , 7)) == false) 
    assert(isDescending(List(0))) 
    } 
+0

Вы должны передать 'tail' функции, а не' lst' with isDescendingHelper – Eduardo

+0

В качестве побочного примечания рассмотрим, можно ли сделать эту функцию более кратким, используя 'zip' и другую функцию более высокого порядка. –

ответ

3

Вы всегда совпадают на том же списке lst, делая так что список не будет исчерпан, вы хотите, чтобы пройти в хвост:

def isDescendingHelper(lst: List[Int], prev: Int, begin: Boolean): Boolean = { 
    lst match{ 
    case Nil => true 
    case head :: tail => { 
     if (begin){ 
     isDescendingHelper(tail, head, false) 
     } else if (head <= prev){ 
     isDescendingHelper(tail, head, false) 
     } else { 
     false 
     } 
    } 
    } 
} 
+1

Также' if (begin) 'и' else if (head <= prev) 'делают точно то же самое , Таким образом, можно удалить первый 'if else', а также параметр' begin'. – Clashsoft

Смежные вопросы