Home Software Engineering The way to carry out Perform Iteration in Golang

The way to carry out Perform Iteration in Golang

0
The way to carry out Perform Iteration in Golang

[ad_1]

The problem

The aim of this problem is to write down a higher-order perform returning a brand new perform that iterates on a specified perform a given variety of instances. This new perform takes in an argument as a seed to start out the computation.

For example, think about the perform getDouble. When run twice on worth 3, yields 12 as proven under.

getDouble(3) => 6
getDouble(6) => 12

Allow us to identify the brand new perform createIterator and we should always have the ability to receive the identical end result utilizing createIterator as proven under:

var doubleIterator = createIterator(getDouble, 2); // Runs *getDouble* twice
doubleIterator(3) => 12

For the sake of simplicity, all perform inputs to createIterator would perform returning a small quantity and the variety of iterations would all the time be integers.

The answer in Golang

Choice 1:

bundle resolution
func CreateIterator(fn func(int) int,n int) func(int) int {
  return func (i int) int {
    for j := 0; j < n; j++ { i = fn(i) }
    return i
  }
}

Choice 2:

bundle resolution
func CreateIterator(fn func(int) int,n int) func(int) int {
  if n == 0 {
    return func(x int) int { return x } // id
  } else {
    return func(x int) int { return CreateIterator(fn, n-1)(fn(x)) }
  }
}

Choice 3:

bundle resolution
func CreateIterator(fn func(int) int,n int) func(int) int {
    if n < 1 {
      return nil
    }
    var retFunc = func(r int) int {
      for i := n ; i>0 ; i-- {
        r = fn(r)
      }
      return r
    }
    return retFunc
}

Check instances to validate our resolution

bundle solution_test
import (
    . "github.com/onsi/ginkgo"
    . "github.com/onsi/gomega"
)
var _ = Describe("Iterator for 'getDouble' perform",func() {
    var getDouble = func(n int) int {return 2*n}
    It("Operating the iterator as soon as",func() {
        doubleIterator := CreateIterator(getDouble,1)
        Count on(doubleIterator(3)).To(Equal(6))
        Count on(doubleIterator(5)).To(Equal(10))
    })
    It("Operating the iterator twice",func() {
        getQuadruple := CreateIterator(getDouble,2)
        Count on(getQuadruple(2)).To(Equal(8))
        Count on(getQuadruple(5)).To(Equal(20))
    })
})

[ad_2]

LEAVE A REPLY

Please enter your comment!
Please enter your name here