演算法是軟體的靈魂。本系列「一步一步寫演算法」核心原則:
以線性搜尋 int find(int array[], int length, int value) 為例,示範從最小可行版本演進到泛型指標版的完整 TDD 過程。
/* find_v1.c */
int find(int array[], int length, int value)
{
if (array == NULL || length == 0) return -1; /* FALSE 用 -1 表示 */
return -1; /* 暫時未實作搜尋 */
}
/* test_v1.c */
void test_null_and_zero_length(void)
{
int arr[10] = {0};
assert(find(NULL, 10, 10) == -1);
assert(find(arr, 0, 10) == -1);
}
/* find_v2.c */
int find(int array[], int length, int value)
{
if (array == NULL || length == 0) return -1;
for (int i = 0; i < length; ++i)
if (array[i] == value) return i;
return -1;
}
/* test_v2.c */
void test_basic_search(void)
{
int arr[10] = {1, 2};
assert(find(arr, 10, 1) == 0);
assert(find(arr, 10, 10) == -1);
}
用指標走訪避免索引運算,回傳索引時用指標差除以元素大小。
/* find_v3.c */
int find(int array[], int length, int value)
{
if (array == NULL || length == 0) return -1;
int *start = array;
int *end = array + length;
while (start < end) {
if (*start == value)
return (start - array) / sizeof(int);
++start;
}
return -1;
}
支援任意可比較型別。
/* find_v4.hpp */
template
int find(T array[], int length, T value)
{
if (array == NULL || length == 0) return -1;
T *start = array, *end = array + length;
while (start < end) {
if (*start == value) return (start - array) / sizeof(T);
++start;
}
return -1;
}
/* test_v4.cpp */
void test_template(void)
{
double arr[10] = {1.5, 2.5};
assert(find(arr, 10, 1.5) == 0);
assert(find(arr, 10, 9.9) == -1);
}
四個版本每步皆有測試保護,重構時跑測試即知是否回歸。這正是「測試驅動開發」在演算法實作上的體現:紅燈 → 綠燈 → 重構,循序漸進,構建健壯程式碼。