日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三分查找C语言实现

發布時間:2024/4/18 编程问答 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三分查找C语言实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

三分查找C語言實現
關鍵詞: 變參函數、函數指針、三分查找、C語言

昨天我動手實現了一下基于變參函數的一元N次函數的代碼實現,以及三分查找的代碼實現。這份代碼中fact_func函數是可變參函數;fact_func2函數的參數是一個大小已知的數組(類似于Linux main函數中的argc, argv[]);thrid_search函數是一個三分查找函數。 不過在調用函數指針的時候遇到了問題:

  • 不清楚如何表示 變參函數指針。
  • 即使變參函數指針可以傳遞,變參函數的可變參數列表又該如何傳遞?(個人想到用C語言的變參宏,不過如果宏定義一個代碼塊,沒有返回值,這個代碼實現又有點雞肋)
  • thrid_search函數中使用了flag參數,個人覺得具體代碼實現有點low(重復代碼段有點長,這里還可以優化)。
  • 這段代碼有沒有bug?邊界條件可能處理不好。
  • /*************************************************************************> File Name: 2.third_search.c> Author: ChenXiansen > Mail: 1494089474@qq.com > Created Time: Sun 22 Nov 2020 02:30:21 PM CST************************************************************************/ #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语言实现的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。