11特殊函數

一、遞歸函數

  • 遞歸概念:如果一個函數內部,包含了對自身的調用,則該函數稱為遞歸函數。
  • 要點:
    • 只有能被表達為遞歸的問題,才能用遞歸函數解決。
    • 遞歸函數必須有一個可直接退出的條件,否則會進入無限遞歸。
    • 遞歸函數包含兩個過程,一個逐漸遞進(答案越來越接近)的過程,和一個逐漸回歸(條件越來越接近)的過程。
  • 遞歸問題:
    • 依次輸出 n 個自然數:
    • 階乘。 寫一個函數,輸入參數數據(階乘數),比如5,返回1*2*3*4*5
  • 示例代碼:
#include <stdio.h>// 例子1:輸出自然數
void func1(int num)
{if (num < 0)                 // 1、可退出條件(自然數:非負整數){return;}func1(num-1);                // 2、逐漸回歸(條件越來越接近)的過程printf("%d ", num);          // 3、逐漸遞進(答案越來越接近)的過程
}// 例子2:階乘
int func2(int num)
{if (num > 1)                 // 1、可退出條件(自然數:非負整數){num = num*func2(num-1);  // 2、逐漸回歸(條件越來越接近)的過程}return num;                  // 3、逐漸遞進(答案越來越接近)的過程
}// 主函數
int main(void)
{// 例子1:func1(10);// 例子2:int ret = func2(5);printf("ret == %d\n", ret);return 0;
}

可以理解為,如果條件成立,就可以一直調用自己,然后就是每次調用都有打印,但不是立即輸出出來,而是當退出條件滿足時它才把所有之前打印的按倒序打印出來。例如下圖可以幫助理解。

?

二、靜態函數

  • 背景知識:普通函數都是跨文件可見的,即在文件 a.c 中定義的函數可以在 b.c 中使用。
  • 靜態函數:只能在定義的文件內可見的函數,稱為靜態函數。
  • 語法:
staitc void f(void) // 在函數頭前面增加關鍵字 static ,使之成為靜態函數
{// 函數體
}
  • 要點:
    • 靜態函數主要是為了縮小函數的可見范圍,減少與其他文件中重名函數沖突的概率。
    • 靜態函數一般被定義在頭文件中,然后被各個源文件包含。
  • 圖解:

?

  • 示例代碼:

main.c文件

#include <stdio.h>extern int num;
extern void A_func1(void);
extern void B_func1(void);// 主函數
int main(int argc, char const *argv[])
{num = 200;printf("num == %d\n", num);A_func1();// B_func1();   // 此函數在b.c中,但是被static關鍵字屏蔽了,無法在此處使用return 0;
}

a.c文件:

#include <stdio.h>// 一、全局變量和函數
// 全局變量
int num = 100;// 全局函數
void A_func1(void)
{printf("A_func1........\n");
}// 二、本文件的變量和函數
// 全局變量// 全局函數

b.c文件

#include <stdio.h>// 一、全局變量和函數
// 全局變量// 全局函數// 二、本文件的變量和函數
// 全局變量
static int num = 100;// 全局函數
static void B_func1(void)
{printf("B_func1........\n");
}

三、回調函數(一般不用)

  • 概念:函數實現方不調用該函數,而由函數接口提供方間接調用的函數,稱為回調函數。
  • 要點:
    • 示例中函數 sighandler 是回調函數。
    • signal() 將函數回調函數傳遞給內核,使得內核可以在恰當的時機回調 sighandler。
    • 應用開發者和內核開發者只要約定好回調函數的接口,即可各自開發,進度互不影響。
  • 示例1:系統中的信號處理,是一個典型的利用回調函數的情形。

  • 示例2:間接調用
#include <stdio.h>
void func1(void)
{printf("1111111111\n");
}void func2(void)
{func1();
}int main(int argc, char const *argv[])
{// 1、直接調用func1();// 2、間接調用func2();// 為什么我們要間接調用???// 普通函數的寫法void func(void){}  // 線程函數的寫法:void* PT_func(void){func();}return 0;
}
  • 示例3:涉及函數指針的回調函數
#include <stdio.h>
// 普通函數
// 加法
int add(int a, int b)
{return a+b;
}// 減法
int substration(int a, int b)    // 該函數的類型:int  (int, int);
{return a-b;
}// 回調函數(間接調用)
int callback(int a, int (*p)(int, int), int b)
{printf("%d\n", p(a, b));
}// 主函數
int main(int argc, char const *argv[])
{// 1、直接使用回調函數callback(100, add, 200);callback(100, substration, 200);// 2、間接使用回調函數(覺得這個名字不夠準確表達,可以利用這個方式進行重新命名)int (*count)(int, int (*)(int, int), int) = callback;count(100, add, 200);count(100, substration, 200);return 0;
}

至此,希望看完這篇文章的你有所收獲,我是Bardb,譯音八分貝,道友,下期見!

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72028.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72028.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72028.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

如何使用useContext進行全局狀態管理?

在 React 中&#xff0c;使用 useContext 進行全局狀態管理是一種有效的方法&#xff0c;尤其在需要在多個組件之間共享狀態時。useContext 允許你在組件樹中傳遞數據&#xff0c;而無需通過每個組件的 props 逐層傳遞。以下是關于如何使用 useContext 進行全局狀態管理的詳細指…

鴻蒙 ArkUI 實現敲木魚小游戲

敲木魚是一款具有禪意的趣味小游戲&#xff0c;本文將通過鴻蒙 ArkUI 框架的實現代碼&#xff0c;逐步解析其核心技術點&#xff0c;包括動畫驅動、狀態管理、音效震動反饋等。 一、架構設計與工程搭建 1.1 項目結構解析 完整項目包含以下核心模塊&#xff1a; ├── entry…

神經性肺纖維的預防方法

神經性肺纖維的預防方法 一、引言 神經性肺纖維化是一種慢性進行性肺部疾病&#xff0c;其病因復雜&#xff0c;包括遺傳、環境等多種因素。該病不僅影響患者的呼吸功能&#xff0c;還可能對神經系統造成損害。因此&#xff0c;預防神經性肺纖維化顯得尤為重要。本文將詳細介…

azure sql 網絡安全組 網絡安全sql注入

&#x1f345; 點擊文末小卡片 &#xff0c;免費獲取網絡安全全套資料&#xff0c;資料在手&#xff0c;漲薪更快 SQL注入 1、原理 針對注入的攻擊行為可描述為通過用戶可控參數中注入SQL語法&#xff0c;破壞原有SQL結構&#xff0c;達到編寫程序意料之外結果的攻擊行為。 其…

【Day50 LeetCode】圖論問題 Ⅷ

一、圖論問題 Ⅷ 1、dijkstra算法 堆優化 采用堆來優化&#xff0c;適合節點多的稀疏圖。代碼如下&#xff1a; # include<iostream> # include<vector> # include<list> # include<queue> # include<climits>using namespace std;class myco…

利用node.js搭配express框架寫后端接口(一)

Node.js 憑借其高效的非阻塞 I/O 操作、事件驅動架構以及輕量級的特點&#xff0c;成為了開發高性能服務器應用的熱門選擇。Express 框架作為 Node.js 上最流行的 Web 應用框架之一&#xff0c;以其簡潔的 API 和豐富的中間件生態系統&#xff0c;極大地簡化了 Web 后端開發流程…

【小白數學】為什么可以用拉格朗日乘子法求函數的極值【二】

我們在上一篇【小白數學】- 為什么可以用拉格朗日乘子法求函數的極值【一】已經介紹了一種較為“嚴謹“的方法來說明為什么拉格朗日乘子法可以幫助我們求具有等式約束條件下的函數的極值。雖然在我們的例子中”等式約束“中只有一個等式。但其實很容易推廣到多個等式約束的情況…

JAVA面試_進階部分_netty面試題

1.BIO、NIO 和 AIO 的區別&#xff1f; BIO&#xff1a;一個連接一個線程&#xff0c;客戶端有連接請求時服務器端就需要啟動一個線程進行處理。線程開銷大。 偽異步 IO&#xff1a;將請求連接放入線程池&#xff0c;一對多&#xff0c;但線程還是很寶貴的資源。 NIO&#x…

考研出分24小時,人類精神狀態圖鑒

2月24日&#xff0c;上午10點起&#xff0c;各省考研初試成績陸續公布&#xff0c;考生們或緊張的輸入準考證號&#xff0c;或抱團等待“審判”。然而更魔幻的還在后頭——下午4點&#xff0c;教育部竟在同一天直接發布了《2025年研考國家分數線》。 不少網友表示&#xff1a;…

川翔云電腦優勢總結

在數字化時代&#xff0c;川翔云電腦依托云計算技術&#xff0c;為用戶解決硬件性能瓶頸問題。川翔云電腦使用云渲碼&#xff1a;【2355】 卓越硬件配置&#xff1a;配備 RTX 3090、48G 顯存的 RTX 4090plus&#xff0c;支持 1 - 8 卡機配置&#xff0c;多卡并行計算能力強&am…

DeepSeek開源周Day4:三連發!突破 AI 訓練瓶頸的立體解決方案,并行計算三劍客DualPipe、EPLB與Profile-data

項目地址&#xff1a; https://github.com/deepseek-ai/DualPipehttps://github.com/deepseek-ai/eplbhttps://github.com/deepseek-ai/profile-data 開源日歷&#xff1a;2025-02-24起 每日9AM(北京時間)更新&#xff0c;持續五天 (4/5)&#xff01; ? ? 一、背景概述 …

基于W2605C語音識別合成芯片的智能語音交互鬧鐘方案-AI對話享受智能生活

隨著科技的飛速發展&#xff0c;智能家居產品正逐步滲透到我們的日常生活中&#xff0c;其中智能鬧鐘作為時間管理的得力助手&#xff0c;也在不斷進化。基于W2605C語音識別與語音合成芯片的智能語音交互鬧鐘&#xff0c;憑借其強大的聯網能力、自動校時功能、實時天氣獲取、以…

Vite與Turbopack現代構建工具架構解析:秒級構建的性能奧秘

引言&#xff1a;傳統構建工具的效能瓶頸 Shopify將前端倉庫遷移至Vite后&#xff0c;HMR更新時間從Webpack的4.2秒縮短至48毫秒。Turbopack在Vercel生產環境測試中&#xff0c;增量構建速度較Webpack快700%。ChromeOS團隊采用Vite后&#xff0c;生產構建從Webpack的17分鐘優化…

網絡基礎知識-2

N個節點完全互聯的網型網即N個節點的無向完全圖&#xff0c;無向完全圖的邊數計算如下&#xff1a;每個節點都要指向其他N-1個節點&#xff0c;但是因為無向兩個節點之間的邊會重復&#xff0c;因此有N(N-1)/2條邊HDLC&#xff08;高級數據鏈路控制協議&#xff09;是一種面向比…

視頻級虛擬試衣技術在淘寶的產品化實踐

作為一種新的商品表現形態&#xff0c;內容幾乎存在于手淘用戶動線全流程&#xff0c;例如信息流種草內容、搜索消費決策內容、詳情頁種草內容等。通過低成本、高時效的AIGC內容生成能力&#xff0c;能夠從供給端緩解內容生產成本高的問題&#xff0c;通過源源不斷的低成本供給…

藍橋備賽(三)- 條件判斷與循環(下)

一、for循環 1.1 for 循環語法形式 for 循環是三種循環中使用最多的 &#xff0c; for 循環的語法形式如下&#xff1a; 1.2 執行流程 for 循環中 &#xff0c; 表達式1&#xff08;初始化&#xff09;只執行一次 &#xff01; 1.3 實踐 練習&#xff1a;使用 for 循環在屏幕…

VMware Fusion 虛擬機Mac版 安裝CentOS 7 系統

介紹 CentOS是Community Enterprise Operating System的縮寫&#xff0c;也叫做社區企業操作系統。是企業Linux發行版領頭羊Red Hat Enterprise Linux的再編譯版本&#xff08;是一個再發行版本&#xff09;&#xff0c;而且在RHEL的基礎上修正了不少已知的 Bug &#xff0c;相…

如果更換ip地址會怎么樣?網絡ip地址怎么更換

IP地址&#xff0c;作為網絡設備的數字身份證&#xff0c;其穩定性和安全性對于網絡通訊至關重要。然而&#xff0c;在某些特定情況下&#xff0c;我們可能需要更換設備的IP地址&#xff0c;以滿足安全、隱私或網絡管理的需求。那么&#xff0c;如果更換IP地址會怎么樣&#xf…

網絡通信/IP網絡劃分/子網掩碼的概念和使用

文章目錄 概述子網的考題子網掩碼的歷史有/無類地址子網劃分!子網掩碼超網技術/CIDR子網掩碼和路由IP子網掩碼定義 網絡規劃網絡規劃-拆子網網絡規劃-組超網子網劃分案例 區分于其他特殊IP地址IP地址和網絡地址子網掩碼和網絡地址子網掩碼和廣播地址 子網間的通信其他 概述 本…

評估自動駕駛(AD)策略性能的關鍵指標

以下是針對自動駕駛&#xff08;AD&#xff09;策略性能評測指標的詳細解讀&#xff0c;結合其物理意義與工程價值&#xff1a; 核心評測指標分類與含義 1. 安全性指標&#xff08;Safety&#xff09; 動態碰撞率&#xff08;Dynamic Collision Ratio, DCR&#xff09; 定義&a…