Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: ЯП scala, ошибка - "reassignmet to val"  (Прочитано 782 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
ЯП scala, ошибка - "reassignmet to val"
« : 13 Августа 2015, 17:43:47 »
подскажите, почему код не компилируется?
Код: (scala) [Выделить]
object Nod_Ev{
  def main(args: Array[String]): Unit = {
    print(Nod(10, 5))
  }
  def Nod(a: Int = 0, b: Int = 0): Int = {
    while (b != 0 && a!= 0){
      if (a > b) a %= b
      else b %= a
    }
    a + b
  }
}
ошибка на строках 7-8
Код: (scala) [Выделить]
if (a > b) a %= b
      else b %= a
Почему-то любые действия связанные с присваивание не работают внутри функции.
Эквивалентный код на других ЯП работает нормально.
Код: (Java) [Выделить]
public class Nod_Java {
        public static void main(String[] args){
            System.out.print(Nod(10, 5));
        }
        private static int Nod(int a, int b) {
            while (a != 0 && b != 0) {
                if (a > b) {
                    a %= b;
                } else {
                    b %= a;
                }
            }
            return a + b;
        }
    }
Операция присваивания вообще не работает в функциях, вернее работает, если создать локальную var переменную, присвоить ей значение той переменной которую передаешь в функцию и уже работать с ней.
Код: (scala) [Выделить]
object Nod_Ev{
  def main(args: Array[String]): Unit = {
    print(Nod(10, 5))
  }
  def Nod(a: Int, b: Int): Int = {
    var j: Int = a
    var i: Int = b
    while (j != 0 && i != 0) {
      if (j > i) {
        j %= i
      }
      else {
        i %= j
      }
    }
    return i + j
  }
}
А как работать с переменными которые переданы в функцию.
« Последнее редактирование: 13 Августа 2015, 21:59:14 от DenisVASI »

Оффлайн Olej

  • Забанен
  • Активист
  • *
  • Сообщений: 884
    • Просмотр профиля
Re: ЯП scala, ошибка - "reassignmet to val"
« Ответ #1 : 13 Августа 2015, 23:25:30 »
подскажите, почему код не компилируется?
Разбираться не хочется ... в облом ... ;)
Поменяйте Int на int.

Оффлайн DenisVASI

  • Автор темы
  • Участник
  • *
  • Сообщений: 116
    • Просмотр профиля
Re: ЯП scala, ошибка - "reassignmet to val"
« Ответ #2 : 14 Августа 2015, 00:23:09 »
Нет в scala такого класса "int".

Пользователь решил продолжить мысль [time]14 Август 2015, 01:31:03[/time]:
есть предположение что параметры которые передаются в функцию являются val (что-то вроде const в других языках) из-за этого с ними нельзя напрямую работать, тогда вопрос как с ними быть, не создавать ведь вечно локальные переменные.

Пользователь решил продолжить мысль [time]14 Август 2015, 01:43:57[/time]:
Что интересно, сижу тут, листаю книгу по scala и не могу найти в ней ни одного прямого обращения к параметру, везде через какое - нибудь присваивание, к счетчику цикла например.

Пользователь решил продолжить мысль [time]14 Август 2015, 02:02:43[/time]:
Отлично например работает такой вариант:
Код: (scala) [Выделить]
object Nod_Recursion{
  def main(args: Array[String]) {
    val a: Int = readInt()
    val b: Int = readInt()
    print(Nod_R(a, b))
  }
  def Nod_R(a: Int, b: Int): Int ={
    if (b == 0)
      return a
    return Nod_R(b, a % b);
  }
}

Пользователь решил продолжить мысль [time]14 Август 2015, 02:04:57[/time]:
Или бинарный вариант, с хвостовой рекурсией
Код: (scala) [Выделить]
object BNod{
  def main(args: Array[String]): Unit = {
    print(Nod(-5, 10))
  }
  def Nod(a: Int, b: Int): Int ={
    if (a == 0) return b
    if (b == 0) return a
    if (a == b) return a
    if (a == 1 || b == 1) return 1
    if ((a % 2 == 0) && (b % 2 == 0)) return 2 * Nod(a / 2, b / 2)
    if ((a % 2 != 0) && (b % 2 == 0)) return Nod(a, b / 2)
    return Nod(b, (a - b).abs)
  }
}

Пользователь решил продолжить мысль [time]14 Август 2015, 02:09:28[/time]:
Кстати учитывая что если в алгоритм Евклида передать отрицательные значения, то будет ошибка, тут можно даже воспользоваться тем что я объявил локальные переменные:
Код: (scala) [Выделить]
object Nod_Ev{
  def main(args: Array[String]): Unit = {
    print(Nod(10, 5))
  }
  def Nod(a: Int, b: Int): Int = {
    var j: Int = a.abs
    var i: Int = b.abs
    while (j != 0 && i != 0) {
      if (j > i) {
        j %= i
      }
      else {
        i %= j
      }
    }
    return i + j
  }
}
« Последнее редактирование: 14 Августа 2015, 01:10:31 от DenisVASI »

 

Страница сгенерирована за 0.062 секунд. Запросов: 26.