C語言初階—函數(函數的聲明和定義,函數遞歸)

????????函數聲明:

????????1.告訴編譯器有一個函數叫什么,參數是什么,返回類型是什么,但是具體是不是存在,函數聲明決定不了。

????????2.函數的聲明一般出現在函數使用之前,要滿足先聲明后使用。

????????3.函數的聲明一般要放在頭文件中。

????????函數定義:

????????函數定義是指函數的具體實現,交代函數的功能實現。

????????函數定義在后面,在前面使用,會產生警告,因為是從前往后執行的。

????????在函數使用之前,加上函數聲明就不會產生警告。

????????函數遞歸

????????程序調用自身的編程技巧稱為遞歸。

? ? ? ? 遞歸作為一種算法在程序設計語言中廣泛應用,一個過程或函數在其定義或說明中有直接或間接調用自身的。

? ? ? ? 一種方法,它通常把一個大型復雜的問題層層轉換為與一個與原問題相似的規模較小的問題來求解,遞歸策略。

? ? ? ? 只需少量的程序就可描述出解題過程中需要的多次重復計算,大大減少了程序的代碼量。

? ? ? ? 遞歸的主要思考方式在于:把大事化小

????????遞歸的兩個必要條件

????????1.存在限制條件,當滿足這個限制條件的時候,遞歸便不在繼續。

? ? ? ? 2.每次遞歸調用后越來越接近這個限制條件。

//輸入1234,按位輸出:1 2 3 4

把大事化小:

print(1234) ---> print(123)? 4 --->?print(12)? 3 4 ---> print(1) 2 3 4? ---> 1 2 3 4

#include <stdio.h>void print(int x){if(x / 10 != 0){print(x / 10);}printf("%d\n",x % 10);
}
//輸入1234,輸出:1 2 3 4
int main()
{int n = 0;scanf("%d",&n);print(n);return 0;
}

????????自定義求字符串長度的函數

#include <stdio.h>//int my_strlen(char* ch){
//	int count = 0;
//	while(*ch != '\0')
//	{
//		count++;
//		ch++;
//	}
//		return count;
//}
//不創建臨時變量,求字符串長度
int my_strlen(char* ch){if(*ch != '\0'){//return my_strlen(++ch) + 1;//這種寫法雖然可以,但是會改變chreturn my_strlen(ch + 1) + 1;}elsereturn 0;
}
int main()
{int length = 0;char ch[12] = "Hello World";length = my_strlen(ch);printf("%d\n",length);system("pause");return 0;
}

????????上面一種注釋掉的方法是用while循環,并創建臨時變量來輔助計數,也可以使用遞歸:

my_strlen("abc") ---> 1 +?my_strlen("bc") ---> 1 + 1 +?my_strlen("c") ---> 1 + 1 + 1 +?my_strlen("") ---> 1 + 1 + 1 + 0 = 3

????????計算k的階乘

#include <stdio.h>//計算k的階乘//遞歸實現
//int fac(int x){
//	if(x != 1)
//		return x * fac(x - 1);
//	else
//		return 1;
//}//迭代實現
int fac(int x){int i = 0;int ret = 1;for(i = 1;i <= x;i++)ret = ret * i;return ret;
}
int main()
{int k = 0;int n = 0;scanf("%d",&k);n = fac(k);printf("%d\n",n);return 0;
}

????????斐波那契數列:

#include <stdio.h>//斐波那契數列
//遞歸
//int Fibonacci(int x){
//	if(x <= 2)
//		return 1;
//	else
//		return Fibonacci(x - 1) + Fibonacci(x - 2);
//}
//非遞歸
int Fibonacci(int x){int i = 0;int a = 1;int b = 1;int c = 0;if(x <= 2)return 1;elsefor(i = 3;i <= x;i++){c = a + b;a = b;b = c;}return c;
}
//1 1 2 3 5 8
int main()
{int k = 0;int n = 0;scanf("%d",&k);n = Fibonacci(k);printf("%d\n",n);return 0;
}

????????系統分配給程序的棧空間是有限的,但是如果出現了死循環或死遞歸,這樣有可能導致一直開辟棧空間,最終產生棧空間耗盡的情況,這樣的現象我們成為棧溢出。

????????如何解決上述問題:

1.將遞歸改寫為非遞歸

2.使用 static 對象替代 nonstatic 局部對象。在遞歸函數設計中,可以使用static對象替代nonstatic局部對象(即棧對象),這不僅可以減少每次遞歸調用和返回時產生和釋放nonstatic對象的開銷,而且static對象還可以保存遞歸調用的中間狀態,并且可為每個調用層所訪問。

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

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

相關文章

Launch學習

參考博客&#xff1a; (1) 史上最全的launch的解析來啦&#xff0c;木有之一歐 1 ROS工作空間簡介 2 元功能包 src目錄下可以包含多個功能包&#xff0c;假設需要使用機器人導航模塊&#xff0c;但是這個模塊中包含著地圖、定位、路徑規劃等不同的功能包&#xff0c;它們的邏…

agent內存馬

搭建一個簡單的Servlet項目 ServletDemo package com.naihe;import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException;…

【探索AI】十一 深度學習之機器學習基礎

鑒于之前文章中提到的深度學習計劃&#xff0c;后續的文章會根據之前的接著繼續學習&#xff0c;python基礎略過&#xff0c;想學的同學請自學&#xff1a; python入門 python進階 機器學習基礎 機器學習是人工智能領域的一個子集&#xff0c;它專注于從數據中自動學習并提升…

vue2+若依框架plus交互 路由介紹

本周及寒假 參加了校企合作的工程過程管理&#xff0c;和學長學姐一起寫項目&#xff0c;之前學了vue也沒有應用&#xff0c;然后對框架很多組件的用法不太了解&#xff0c;前期耽誤了一些時間。 框架模塊 首先是框架模塊的介紹 api存了一些系統管理及發送請求的方法 例如p…

【python】`assert`斷言語句

assert是一個斷言語句&#xff0c;用于在代碼中檢查某個條件是否為真。 如果條件為假&#xff0c;將觸發AssertionError 異常&#xff0c;從而指示存在錯誤。

Linux獲取進程(系統啟動時間和運行時間)運行時間

Linux獲取進程運行時間 思路&#xff1a;使用 ps - o命令 ps -p 986 -o etime可以獲取進程986的執行時間&#xff0c;不論系統時間有沒有發生改變&#xff0c;它都可以返回正確的結果: 總結&#xff1a;etime 是真正的程序運行時間&#xff0c;而不是系統運行時間與進程啟動…

在您的下一個項目中選擇 Golang 和 Node.js 之間的抉擇

作為一名軟件開發者&#xff0c;我總是在尋找構建應用程序的最快、最高效的工具。在速度和處理復雜任務方面&#xff0c;我認為 Golang 和 Node.js 是頂尖技術。兩者在性能方面都享有極高的聲譽。但哪一個更快——Golang 還是 Node&#xff1f;我決定深入一些硬核基準測試&…

java-ssm-jsp-寵物護理預定系統

java-ssm-jsp-寵物護理預定系統 獲取源碼——》公主號&#xff1a;計算機專業畢設大全

ASPICE實操中的那點事兒-底層軟件的單元測試該如何做

先來說下ASPICE項目實操中遇到的問題&#xff1a; 底層軟件在做單元測試時&#xff0c;從ASPICE角度看&#xff0c;該如何做&#xff1f;要不要在目標控制器或開發板中去測&#xff1f;尤其是復雜驅動&#xff0c;如果不在將程序下載到硬件中&#xff0c;該如何測試&#xff1…

物聯網與智慧城市:融合創新,塑造未來城市生活新圖景

一、引言 在科技飛速發展的今天&#xff0c;物聯網與智慧城市的融合創新已成為推動城市發展的重要力量。物聯網技術通過連接萬物&#xff0c;實現信息的智能感知、傳輸和處理&#xff0c;為智慧城市的構建提供了無限可能。智慧城市則運用物聯網等先進技術&#xff0c;實現城市…

使用R語言進行Logistic回歸分析(2)

一、數據集描述&#xff0c;問題要求 下表是40位肺癌病人的生存資料&#xff0c;X1表示生活行為能力平分&#xff08;1到100&#xff09;&#xff0c;X2為病人的年齡&#xff08;年&#xff09;&#xff0c;X3由診斷到進入研究的時間&#xff08;月&#xff09;&#xff0c;X4…

291.【華為OD機試】模擬目錄管理(JavaPythonC++JS實現)

??點擊這里可直接跳轉到本專欄,可查閱頂置最新的華為OD機試寶典~ 本專欄所有題目均包含優質解題思路,高質量解題代碼(Java&Python&C++&JS分別實現),詳細代碼講解,助你深入學習,深度掌握! 文章目錄 一. 題目-模擬目錄管理二.解題思路三.題解代碼Python題解…

計算機設計大賽 深度學習火車票識別系統

文章目錄 0 前言1 課題意義課題難點&#xff1a; 2 實現方法2.1 圖像預處理2.2 字符分割2.3 字符識別部分實現代碼 3 實現效果4 最后 0 前言 &#x1f525; 優質競賽項目系列&#xff0c;今天要分享的是 &#x1f6a9; 圖像識別 火車票識別系統 該項目較為新穎&#xff0c;適…

Pycharm的下載安裝與漢化

一.下載安裝包 1.接下來按照步驟來就行 2.然后就能在桌面上找到打開了 3.先建立一個文件夾 二.Pycharm的漢化

ABAP - SALV教程07 斑馬紋顯示和SALV標題

SALV設置斑馬紋和標題 METHOD set_layout.DATA: lo_display TYPE REF TO cl_salv_display_settings. * 取得顯示對象lo_display co_alv->get_display_settings( ).* 設置ZEBRA顯示lo_display->set_striped_pattern( X ). * 設置Titlelo_display->set_list_he…

企業微信變更主體怎么改?

企業微信變更主體有什么作用&#xff1f;做過企業運營的小伙伴都知道&#xff0c;很多時候經常會遇到現有的企業需要注銷&#xff0c;切換成新的企業進行經營的情況&#xff0c;但是原來企業申請的企業微信上面卻積累了很多客戶&#xff0c;肯定不能直接丟棄&#xff0c;所以這…

【二】【SQL】去重表數據及分組聚合查詢

去重表數據 表的準備工作 去除表中重復的數據&#xff0c;重復的數據只留一份。 mysql> create table duplicate_table (-> id int,-> name varchar(20)-> ); Query OK, 0 rows affected (0.03 sec)mysql> insert into duplicate_table values-> (100,aaa)…

Day24-yum與rpm軟件包管理2

Day24-yum與rpm軟件包管理2 1. 配置緩存rpm包2. 為什么要緩存&#xff1f;3. 組包相關指令4. yum幫助與補全功能4.1 補全4.2 什么是yum源4.3 常見互聯網 yum 源 5. 搭建局域網YUM倉庫實踐 1. 配置緩存rpm包 修改yum.conf配置 [rootoldboy ~]# sed -i.bak s#keepcache0#keepca…

SLAM基礎知識:前端和后端

在基于濾波的SLAM算法中&#xff0c;使用迭代卡爾曼濾波&#xff08;Iterative Kalman Filtering&#xff09;來求解當前幀狀態量的步驟通常屬于SLAM系統的前端部分。 前端負責處理傳感器數據&#xff0c;進行狀態估計和地圖構建的初步步驟。迭代卡爾曼濾波作為一種濾波器&…

批次大小對ES寫入性能影響初探

問題背景 ES使用bulk寫入時每批次的大小對性能有什么影響&#xff1f;設置每批次多大為好&#xff1f; 一般來說&#xff0c;在Elasticsearch中&#xff0c;使用bulk API進行批量寫入時&#xff0c;每批次的大小對性能有著顯著的影響。具體來說&#xff0c;當批量請求的大小增…