lambda
to create a method that we can pass around. Here's the entire program ...
def linear(target, f)
n = 1
while ( f.call(n) != target)
n = n + 1
end
n
end
def binary(target, f)
low, high = 1, 2
while (f.call(high) < target) do high = high*2 end
mid = (high + low) / 2
while (fmid = f.call(mid)) != target do
fmid < target ? (low, mid = mid, (mid + high) / 2) : (high, mid = mid, (low + mid) / 2)
end
mid
end
tetrahedral = lambda { |n| n * (n + 1) * (n + 2) / 6 }
1.upto(10) { |i| puts tetrahedral.call(i) }
puts linear(169179692512835000, tetrahedral)
puts binary(169179692512835000, tetrahedral)
We start out with two methods
linear
and binary
which are pretty straightforward with the exception that both take a function (in this case f
) as a parameter. For linear, we start at 1 and continue calling f
until the value of f(n)
is the same as target
. binary
is similar, but here we keep doubling the high
value until we're above the target
and then we calculate the fmid
and use it as a high or low value until we converge. The
tetrahedral
function itself is created with a lambda so that we can pass it to the other two methods. The next lines are simply tests. Note how much longer the linear
method takes than the binary
. As always, let me know if you have questions or comments.
No comments:
Post a Comment