0%

230403-分治

重要的两点

  • 如何找出基线条件
  • 如何缩小计算规模

示例

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
/**
* 计算元素的和
*/
function sum(arr: number[]) {
if (arr.length === 0) {
return 0;
}
if (arr.length === 1) {
return arr[0];
}
let [c, ...rest] = arr;
return c + sum(rest);
}

let a = sum([2, 4, 6]);
console.log(a);

/**
* 计算元素的长度
*/
function ArrayLength(arr: number[]) {
if (arr.length === 0) {
return 0;
}
let [i, ...rest] = arr;
return 1 + ArrayLength(rest);
}

let a = ArrayLength([2, 4, 6]);
console.log(a);

/**
* 找出元素中的最大值
*/
function maxNumber(arr: number[]) {
if (arr.length === 0) {
return -Infinity;
}
let [i, ...rest] = arr;
let max = maxNumber(rest);
return i > max ? i : max;
}

let a = maxNumber([-1]);
console.log(a);


/**
* 二分查找,分治方法
*/
function midSearch(arr: number[], search: number) {
if (arr.length === 0) {
return -1;
}
if (arr[0] === search) {
return arr[0];
}
let mid = (arr.length - 1) / 2;
if (arr[mid] > search) {
return midSearch(arr.slice(0, mid), search);
} else {
return midSearch(arr.slice(mid, arr.length), search);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 分治,二分查找,Rust版本
fn mid_search(arr: Vec<i32>, search: i32) -> i32 {
if arr.len() == 0 {
return -1;
}
if arr[0] == search {
return arr[0];
}
let mid = (arr.len() - 1) / 2;
if arr[mid] > search {
return mid_search(arr[0..mid].to_vec(), search);
} else {
return mid_search(arr[mid..arr.len()].to_vec(), search);
}
}