生活随笔
收集整理的這篇文章主要介紹了
三分查找C语言实现
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
三分查找C語言實現
關鍵詞: 變參函數、函數指針、三分查找、C語言
昨天我動手實現了一下基于變參函數的一元N次函數的代碼實現,以及三分查找的代碼實現。這份代碼中fact_func函數是可變參函數;fact_func2函數的參數是一個大小已知的數組(類似于Linux main函數中的argc, argv[]);thrid_search函數是一個三分查找函數。 不過在調用函數指針的時候遇到了問題:
不清楚如何表示 變參函數指針。即使變參函數指針可以傳遞,變參函數的可變參數列表又該如何傳遞?(個人想到用C語言的變參宏,不過如果宏定義一個代碼塊,沒有返回值,這個代碼實現又有點雞肋)thrid_search函數中使用了flag參數,個人覺得具體代碼實現有點low(重復代碼段有點長,這里還可以優化)。這段代碼有沒有bug?邊界條件可能處理不好。
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <stdarg.h>typedef double T
;
#define T_token "%lf"
#define epsl 1e-10#define P(val) {\printf("%s: "T_token"\n", #val, val);\
}
#define P_ans(ans, temp, x, n) {\printf("ans += "T_token" + "T_token" * ("T_token" ^ %d)\n", ans, temp, x, n);\
}
#define P_func(n, argv) {\__typeof(n) __temp = n;\printf("Func(x) = ");\while (--n > -1) {\printf("[ "T_token" * (x ^ %d) ]", argv[n], n);\n && printf(" + ");\}\printf("\n");\n = __temp;\
}T
fact_func(T x
, int n
, ...) {T ans
= 0;va_list arg
;va_start(arg
, n
);while (n
--) {T temp
= va_arg(arg
, T
);P_ans(ans
, temp
, x
, n
);ans
+= pow(x
, n
) * temp
;P(ans
);}return ans
;
}T
fact_func2(T x
, int n
, T
* argv
) {T ans
= 0;while(--n
> -1) {T temp
= argv
[n
];ans
+= pow(x
, n
) * temp
;}return ans
;
}T
thrid_search(T head
, T tail
, int flag
, T(*func
)(T
, int, T
*), int n
, T
* argv
) {if (abs(tail
- head
) < epsl
) return head
;T m1
, m2
, l
= head
, r
= tail
;if (flag
> 0) {while (l
+ epsl
< r
) {m1
= ((r
- l
) / 3) + l
;m2
= ((r
- l
) / 3 * 2) + l
;if (func(m1
, n
, argv
) <= func(m2
, n
, argv
)) {r
= m2
;} else {l
= m1
;}}return l
;} else {while (l
+ epsl
< r
) {m1
= ((r
- l
) / 3) + l
;m2
= ((r
- l
) / 3 * 2) + l
;if (func(m1
, n
, argv
) <= func(m2
, n
, argv
)) {l
= m1
;} else {r
= m2
;}}return l
;}
}int main() {int n
, flag
;T left
, right
;n
= 3;printf("請輸入一元二次函數參數: ");T
* hz_argv
= (T
*)malloc(sizeof(T
) * 3);for (int i
= n
- 1; i
>= 0; i
--) {scanf(T_token
, &hz_argv
[i
]);}P_func(n
, hz_argv
);printf("請輸入待查詢左右邊界: ");scanf(T_token
, &left
);scanf(T_token
, &right
);flag
= (hz_argv
[n
- 1] > 0) ? 1 : -1;printf("查找函數極值點:");printf(T_token
"\n", thrid_search(left
, right
, flag
, fact_func2
, n
, hz_argv
));free(hz_argv
);return 0;
}
總結
以上是生活随笔為你收集整理的三分查找C语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。