2014-10-26 3 views
0

im пытается сделать метод, который суммирует рациональные числа, но im застрял на одной части.Как завершить эту рекурсию в Scala?

class Rational(x: Int , y: Int) { 
    private def gcd(a: Int , b: Int) : Int = if (b == 0) a else gcd(b, a % b) 
      private val g = gcd(x, y) 
      def numer = x/g 
      def denom = y/g 


      def +(r: Rational) = 
      new Rational(numer * r.denom + r.numer * denom, 
        denom * r.denom) 
    override def toString = numer+"/"+denom 

def sum (f: Rational => Rational)(a: Rational, b: Rational): Rational = 
     f(a) + sum(f)(a + 1, b) 

У меня возникли проблемы, выясняя (а + 1, б) в моей суммы части, я получаю сообщение об ошибке, которое говорит несоответствие типов Int, я думаю, это потому, что его ожидает рациональное число, но я не знаю, как для преобразования или замены этого 1.

ответ

0

Вы определили оператор a + для Rational, но не для int. Вам также необходимо определить точку выхода для рекурсии, возможно, когда a > b?

Вот один из них, хотя вам потребуется определить оператор > для Rationals. Вы могли бы также рассмотреть два object одиночек для представления 0 и 1:

def sum (f: Rational => Rational)(a: Rational, b: Rational): Rational = 
    if (a > b) // You'll need to define this 
     new Rational(0,1) // Exit point for recursion 
    else 
     f(a) + sum(f)(a + new Rational(1, 1), b) 

Редактировать
Re: Как вы называете это? f - любая функция, которая принимает Rational и возвращает Rational. Вот пример лямбда-идентичности - поэтому в основном все, что мы делаем, добавляя все целые числа от 1 до 5:

override def main(args: Array[String]) { 
    val rat = new Rational(1,1) 
    val theSum = rat.sum(x => x)(new Rational(1,1), new Rational(5,1)) 
    println(theSum) 
} 

Вот IdeOne snippet показывает результат.

+0

хорошо я определено> как. def> (это: Rational) = число * это.деном> это.numer * denom. который, я считаю, работает. теперь смущающая часть lol. Я не знаю, как это проверить. Я пытаюсь использовать x.sum (f) (a, b), im, предполагая, что a и b являются 2-ми рациональными, но он запрашивает у меня функцию, которую я не уверен, что там происходит. –

+0

@ zerocool18 Аполы - я был АФК в течение нескольких часов - обновлялся с образцом. Я думаю, его спорный вопрос о том, является ли 'sum' в его текущем воплощении, как метод экземпляра на' Rational', учитывая, что он не использует ни одно из полей ... – StuartLC

+0

я вижу сейчас !!! но когда я тестирую его, я получаю «основную» ошибку java.lang.StackOverflowError, что означает, что я ошибаюсь в рекурсии, поэтому закрыть lol –

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