【发布时间】:2015-08-18 09:23:51
【问题描述】:
我被困在实现 5 种不同的二进制斩波方式(任务http://codekata.com/kata/kata02-karate-chop/)。您能否就更多方法提出一些想法?
这就是我所得到的:
1)
def left_chop(key, arr):
l = 0
r = len(arr)
while l<r:
m = (l+r)/2
if key<=arr[m]:
r = m
else:
l = m+1
return l if key == arr[l] else -1
2)
def left_chop(key, array, left = 0, right = None):
if right == None:
right = len(array)
if left==right:
return left if key == array[left] else -1
m = (left+right)/2
if key<=array[m]:
return left_chop(key, array, left, m)
else:
return left_chop(key, array, m+1, right)
3)我知道,和第一个很像
class find(object):
def __init__(self, key, array):
self.array = array
self.key = key
self.l = 0
self.r = len(array)
def left_chop(self):
while self.l<self.r:
self.step()
return self.l if self.key == self.array[self.l] else -1
def step(self):
m = (self.l+self.r)/2
if self.key<=self.array[m]:
self.r = m
else:
self.l = m+1
我曾尝试想出一些函数式编程风格的东西,但没有成功。
【问题讨论】:
-
Python 不是最适合函数式编程的语言,如果你喜欢函数式你会喜欢 scala,在纯 python 的 bisect 模块中也有二分算法
-
谢谢,我会尝试 scala。有这样的模块,但它使用类似于第一个的方法:hg.python.org/cpython/file/2.7/Lib/bisect.py
-
第一个不是有效的 Python。
-
谢谢,我已经编辑了帖子。
-
您可能会发现 Rosetta Code 网站很有用。它向您展示了多种语言和风格的算法实现。这是Binary Search 页面和Python 部分。