1. 程式人生 > >C語言中遞迴的原理

C語言中遞迴的原理

最近在學資料結構的二叉樹,裡面的實現好多都是遞迴。博主大一上學期也沒有認真學遞迴,結果就好多不懂。今天特別請教了班上搞ACM的,再上網猜了一些資料才算初步弄懂遞迴的實現原理。

遞迴的底層實現其實是棧,而棧是先進後出的(即先入棧的反而後出棧(類似水瓶中放物取物))

下面是一段階乘遞迴的案例程式碼

#include<stdio.h>

//一個求階乘的遞迴演算法
int f(int n)
{
    if(n==1)
    {
        return 1;
    }
    else
    {
        return n*f(n-1);
    }
}

int main()
{
    printf("%d",f(4));      //求4的階乘
    return 0;
}

程式首先執行的是f(4),進入之後會直接return f(4-1)*4.也就是把這一項入棧.(儘管暫且不知道該式子的具體結果是多少,但不用管,先將它入棧,之後得知f(4-1)的結果後再計算便是)

依次類推,第二次遞迴就是f(3-1)*3入棧

直到n=1,不再遞迴,將1入棧

然後便是出棧了,按照先進後出的特點,先出棧的是f(1)

依次類推,第二個出棧的是f(2),f(2)的結果可根據f(1)得到,一直出棧,直到棧空為止

最終便實現了階乘

博主只是一名學生,能力有限,如有錯誤歡迎各位指出。也希望這篇文章能幫到那些沒有搞ACM的同學。

相關推薦

C語言原理

最近在學資料結構的二叉樹,裡面的實現好多都是遞迴。博主大一上學期也沒有認真學遞迴,結果就好多不懂。今天特別請教了班上搞ACM的,再上網猜了一些資料才算初步弄懂遞迴的實現原理。遞迴的底層實現其實是棧,而棧是先進後出的(即先入棧的反而後出棧(類似水瓶中放物取物))下面是一段階乘遞

c語言的學習

在學習c語言函式部分時,有一個非常重要的知識就是遞迴了。 首先遞迴就是程式呼叫自身的程式設計技巧,遞迴作為一種演算法在程式設計語言中廣泛應用。一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型的複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需要

[C語言]用和非的方法在楊氏矩陣查詢

從楊氏矩陣中查詢數字,以及調整奇數位於陣列的前半部分 //從楊氏矩陣中查詢數字 //1.從右上角開始找,如果要找的值大於當前值,向下找,否則,向左找,方向確定 //2.從左下角開始找,如果要找的值大於當前值,向右找,否則,向上找,方向確定 //---->最

C語言歸什麽時候能夠省略return引發的思考:通過內聯匯編解讀C語言函數return的本質

tle ext 多少 那不 語句 二次 () mar ado 事情的經過是這種,博主在用C寫一個簡單的業務時使用遞歸,因為粗心而忘了寫return。結果發現返回的結果依舊是正確的。經過半小時的反匯編調試。證明了我的猜想,如今在博客裏分享。也是對C語言編

c語言 函式的簡單應用

       利用函式遞迴來時現將一個sh數的每一位拆出來然後求和,即是:例如一個shu數  1888;它的每一位sh是 1  8  8   8,而每一位的每一位的和最終是  25,而接下來jian建立用函式的

C語言演算法的學習

一、初識遞迴 程式呼叫自身的程式設計技巧稱為遞迴( recursion)。 一個過程或函式在其定義或說明中有直接或間接呼叫自身的一種方法,它通常把一個大型複雜的問題層層轉化為一個與原問題相似的規模較小的問題來求解,遞迴策略只需少量的程式就可描述出解題過程所需要的多次重複計算,大大地減少

C語言實現n^k(不考慮k<0的情況)

#include<stdio.h> #include<stdlib.h> int n_power_k(int n,int k){ if (k == 0) { return 1; } return n*n_power_k(n,k-1)

C語言: 用實現對字串的逆置

#include <stdio.h> #include <windows.h> /* 用遞迴實現對字串的逆置 */ void Reverse(char* string) { int len = strlen(string); if (strlen(string)

C語言法求n的階乘

#include<stdio.h> int main() {int njc(int n); int x,n,y; scanf("%d",&n); y=njc(n); printf("%d",y); return 0; } int njc(int n

C語言和非分別實現求n的階乘

#define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include "stdlib.h" #include<stdio.h> //遞迴方法實現N的階乘 int fac1(int n

C語言實現的快速排序

C語言實現遞迴的快速排序 目錄 文章目錄 C語言實現遞迴的快速排序 目錄 原理 程式碼 原理 原理這裡就不多闡述了,主要就是使用頭尾兩個指標,對待排序陣列進行操作,遞迴的收斂返

C語言基礎 的用法及示例

---------------start reading---------------- 前言 遞迴在數學證明中經常使用,其意就是不停的套用同一模板逐漸歸納出最後的結果,用通俗的話來說就是自己呼叫自己。 遞迴呼叫需要注意三個問題 縮小問題規模 邊界條件 返回段

C語言遍歷資料夾)實現檔案批量複製

大專案時時常需要抽出屬於自己編寫的那部分程式碼,從SVN下載後,往往需要一個個的進入資料夾下拿取相應的檔案。這樣很浪費時間,雖然使用bat編寫確實更快,但是我覺得使用C語言可能在檔案過多時會快一點,也是為了 練習練習。如果那裡存在問題,或是不足,歡迎指出。程式碼如下: #includ

C語言 函式

所有的迴圈都可以寫成遞迴,但遞迴不一定能寫成迴圈 # include <stdio.h>//引用函式庫 //遞迴實現累加 int add_r(int num){ if (num

C語言使用法將十進位制數轉換成二進位制數輸出程式

void to_binary(unsigned long n); int main() {  unsigned long number;  printf("請輸入一個整數(按q退出):\n");  while(scanf("%ul",&number)==1)  {   printf("二進位制數是:"

hanoi塔的c語言函式實現

#include <stdio.h> void hanoi(int n,char a,char b,char c)//定義函式  {if(n==1) //如果只有一個,那麼只需要從a杆移至c杆; {printf("%c-->%c\n",a,c);}else //如果有多個 {hanoi(n-

c語言呼叫

遞迴呼叫,簡而言之就是函式呼叫自身。執行遞迴函式將反覆呼叫其自身,每呼叫一次就進入新的一層。遞迴的原理比較簡單,但是想要合理並且高效的應用起來不是那麼容易,因為它的思想比較難,而且稍微控制不好,便會導致程式無限迴圈,浪費記憶體資源,直到最終全部資源被消耗掉而宕機

C語言法將一個整數n轉換成字串

#include<stdio.h> int main(void) { int n; int enter_n(); void print_n(int n); n=enter_n(); print_n(n); return 0; } int enter_n()

C語言

使用遞迴最成功的例子: 漢諾塔:有三根相鄰的柱子,標號為A,B,C,A柱子上從下到上按金字塔狀疊放著n個不同大小的圓盤,要把所有盤子一個一個移動到柱子C上,並且每次移動同一根柱子上都不能出現大盤子在小盤子上方,請問至少需要多少次移動,設移動次數為H(n)。 如果只有一個盤子,那麼我們可以直接將盤子從A移動到C

演算法精解-C語言描述 和尾 (圖解+例項)

遞迴是一種強大的方法,它允許一個物件以其自身更小的形式來定義自己。 讓我們來觀察一下自然界中出現的遞迴現象:蕨類植物的葉子,每片葉子葉脈中的小分支都是整片葉子的較小縮影;又或者兩個反光的物體,相互對映對方漸遠的影像。這樣的例子使我們明白,儘管大自然的力量是強大的,在許多方面