Pull to refresh

Comments 22

Проходили на втором курсе, было приятно вспомнить контрольные на 6 часов. По коду много замечаний (н-р Zero лучше сделать object), напишу утром.
Пишите, буду рад замечаниям, ибо в Scala опыта очень мало
Извините, очень жесткий запар на работе. Если действительно интересны замечания, то выложите на github и я посмотрю.

Вот мой пример в догонку
package org.example

trait Num {
	def value: Int
}

object Zero extends Num {
	val value = 0
}

case class Succ(arg: Num) extends Num {
	val value = arg.value + 1
}

case class Proj( idx: Int, args: Num*) extends Num {//буду считать, что n содержится в args
	require(!args.isEmpty)
	require(0 <= idx && idx < args.size)

	def value = args(idx) value
}

case class Sum(a: Num, b: Num) extends Num {
	def value = (b match {
						case Zero => a
						case Succ(num) => Succ(Proj(2, a, num, Sum(a, num))) 
					}) value
}


object ExampleApp extends App {
	val one = Succ(Zero)
	val two = Succ(Succ(Zero))
  
  	println(Sum(one, two) value)
}

Ваш пример не совсем то, что я хотел получить. Ваше определение succ использует сложение, которое еще не определено, а я же хотел не использовать в принципе нативные классы типа Int и соответственно операции с ними связанные, дабы показать, как определить число как таковое, базируясь на рекурсии и только. Никакого практического интереса в этом конечно нет, но для понимания возможностей рекурсивных функций это, на мой взгляд, хороший пример.
Да, я знал, что вы так скажите =). Ваш пример безусловно хорош этим.
Я использовал Int и операции с ним так как 0 и +1 определены, value только вычисляет выражение.
Я только хотел примером показать, как понятнее становится код, если использовать возможности языка (чем на мой взгляд, ваш пример очень хромает).
Как смогу выложу куда-нибудь. В любом случае, я уверен что ту же идею можно реализовать оптимальней :-) спасибо за комментарий
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
UFO landed and left these words here
Впечатлён лаконичностью и интуитивностью приведённого кода.
Благодарю. Но, как верно заметил btd, он далеко не идеале и его надо бы допилить.
А ссылочка на архив прокомментированного кода будет?
И можно тоже самое, только на ANSI C? )))
Архив с комментированным кодом будет, надеюсь, в течении недели, если времени будет. А вот на ansi c — врятли. Очень плохо знаю с, да и не предназначен он, на мой взгляд, для таких задачь… но если у вас будет желание реализовать — было бы интересно посмотреть :-)
А где же функция Аккремана? :-) Вот здесь похожая реализация множеств.

Пара мелких замечаний: s/вИЮ/Inf (Что это за раскладка?), s/Predicat/Predecessor/.
Функцию Аккремана решил не включать в пост, дабы не запутаться в бесконечных бесконечностях ) Думаю рассказать о ней в следующей статье, если интересно кому-нибудь будет.
Я вот сейчас подумал, и понял что, в принципе, даже операцию сравнения можно реализовать в виде функции, а если очень постараться — то и конструкция if else можно сделать отдельной функцией. Собственно на этом и построена scala… если кому интересно, могу добавить в пост
UFO landed and left these words here
UFO landed and left these words here
Прочитал определение рекурсивной функции. По-вашему число итераций должно быть известно заранее?
Интересно, а как бы вы определили вычисление множества Мандельброта, где число итераций рекурсивной функции — искомое значение?
Sign up to leave a comment.

Articles