-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathbinary_search.human
91 lines (74 loc) · 4.31 KB
/
binary_search.human
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
@doc""" Uses a binary search algorithm to locate a value in the specified array. """
Context binary_search_iterate(items as SortedArray, value as Object) :: Index or None
loop:
init:
[start, stop] = [0, items.length - 1]
pivot $= Math.floor (`start + `stop) / 2
cond:
start < stop
proc:
case items[pivot] <=> value
when LT -> stop = pivot - 1
when GT -> start = pivot + 1
when EQ -> break
result:
pivot
return loop.result
@doc""" Uses a binary search algorithm to locate a value in the specified array. """
Context binary_search_recusive(items as SortedArray, value as Object, \
start as Int, stop as Int) :: Index or None
@doc"开始判断的条件"
_1_:
start ?= 0
stop ?= items.length - 1
pivot $= Math.floor (`start + `stop) / 2
if start > stop: @return Nothing
@doc"改变状态,开始递归执行"
_2_:
case items[pivot] <=> value
when LT -> @recusive(items, value, start, pivot - 1)
when GT -> @recusive(items, value, pivot + 1, stop)
when EQ -> @return pivot
binary_search = binary_search_iterate
# Test the function.
console.log 2 is binary_search [10, 20, 30, 40, 50], 30
console.log 4 is binary_search [-97, 35, 67, 88, 1200], 1200
console.log 0 is binary_search [0, 45, 70], 0
console.log -1 is binary_search [0, 45, 70], 10
__END__
* 类型是必要的。as Array 作为一种在该Context里的行为**局限**。
* Object 是特别的 Context
* Context 是用来对付一些复杂的东西。
* 人类在思维时,会对谈话对象启用默认推理的假设。
* **序号** 前后用 _ ,这样强化以序号为中心,下划线可以被我们的视野几乎忽略。
* Array里的元素可以相互比较
* 过程式编程是可以逐步调试的,Human编程语言如何调试。
* 写一个完美的二分查找,并在代码层面表达出二分查找的核心思想。
* Changeable = val
* 任意上下文 扁平式
* loop 是一个 Context。尽量所有都是Context,并且是惰性和可自省的。
* 进入一个上下文时,必须把关联对象的特性尽可能局限到当下这个上下文的情境中来。
* 序号表示顺序和层次。
* _序号_ 是一个关于序号的 **表达式** ,实际上也类似于传统的用括号来表示优先级。=> 结构化编程。
* 多层复杂逻辑 [或与非] 应该用序号来表示。
* loop 有两个跳出,一个在cond,这里是用语句来替代显式break的。另一个在proc里,在判断后,直接显
式调用break。而cond和proc两者变量时共享的,当然,也包括了在init时。
* 程序里任何的不清晰都是一种罪过啊。
* loop.pivot 可以访问loop内的内部变量。
* pivot 在 loop.init里是可以被语句隐含推理出是整数类型的。
* 代码执行顺序和传统一样,是隐含为顺序的。
* 代码简洁的基础是不伤害解释的逻辑,并不可隐匿解释里需要强调的。
* 程序语法都应该是扁平式的(即没有for,while,loop等循环),只用结构来表示,但是递归呢。
* loop 定义好后返回的是一个过程结构,需要调用 loop.eval 才能运行。
* @doc 自动选择与其下方的,并判断type是啥,比如 Context 或者 Seq 等。
* $= 表示依赖求值。接受参数和函数,一旦参数发生变化,则下次调用时重新求职。
* 用 @recusive 来强制显示表示这是一个递归函数。写出自己名字也可以,但是可以警告吧。
* 在 case when 里,如果用 !> 替换了 -> ,则表示这个判断是直接返回值的。
* 如果 loop 结构里没有 result: ,则默认返回 init 里的最后一个值。
* `compare` 用 <=> 符号表示,恰恰符合 比较操作一定会返回 <=> 其中一个。
* 二分查找的主体是递归循环,并更改状态。
* [传统] 缺陷是 从start, stop 到 pivot 里包含的 <, >, 还有另一个隐含的 = ,得靠推理出来。
* [传统] 没有显式表达出[start, stop, pivot]的依赖, 和循环对之的影响。
* [传统] 没有体现出所有思想。
* @dep_on 表示在相关任意元素改变时,该元素也跟着改变。
* 代码首先是执行正确的才考虑美感,就像菜首先得可口才考虑美感。