1

我目前正在使用 spock 在 groovy 中练习测试驱动开发。我有一组测试,其中 3 个不同的实现做同样的事情:迭代、递归和记忆。所以我创建了一个抽象类来保存测试,然后创建了 3 个不同的文件来返回具体的类实现来运行测试。我有迭代和递归的工作,但我遇到了 memoize() 的问题

import spock.lang.Specification
abstract class FibonacciTest extends Specification {
    private calculator
    abstract def getCalculator()
    def setup() {
        calculator = getCalculator()
    }
    def "test canary"() {
        expect:
        true
    }
    // more tests
}

class RecursiveFibonacciTest extends FibonacciTest {
    def getCalculator() {
        new RecursiveCalculator()
    }
}

class IterativeFibonacciTest extends FibonacciTest {
    def getCalculator() {
        new IterativeCalculator()
    }
}

class MemoizeFibonacciTest extends FibonacciTest {
    def getCalculator() {
        new MemoizeCalculator()
    }
}

class RecursiveCalculator {
    def getFibonacci(position) {
        if (position < 2) {
            1
        }
        else {
            getFibonacci(position - 1) + getFibonacci(position - 2)
        }
    }
}

class IterativeCalculator {
    def getFibonacci(position) {
        if (position < 2) {
            1
        }
        else {
            def value = 1
            def previousValue = 1
            for (i in 2..position) {
                def temporaryValue = previousValue
                previousValue = value
                value = temporaryValue + previousValue
            }
        value
        }
    }
}

所以我已经进行了迭代和递归的工作,但是在让 memoize 工作时遇到了问题。我认为它应该可以工作,但它不是..有人知道我做错了什么吗?

class MemoizeCalculator {
    def getFibonacci = { position ->
        if (position < 2)
            1
        else
            getFibonacci.call(position - 1) + getFibonacci.call(position - 2)
    }.memoize()
}
4

1 回答 1

0

您不能getFibonacci从声明它的同一语句中引用该变量。要么更改getFibonacci.call为,要么在分配变量 ( ) 之前call声明变量 ( )。def getFibonaccigetFibonacci = ...

于 2013-04-08T21:13:49.553 回答