1. 程式人生 > >C語言-遞迴演算法以及經典遞迴(Hanoi)

C語言-遞迴演算法以及經典遞迴(Hanoi)

用遞迴演算法(recursion)計算階乘

codes:

/**************************************
*author: Yang Xu
*goals: compute factorial by recursion
***************************************/

#include<stdio.h>
#include<process.h>

int main()
{
    /*print the result of factorial*/
    printf("%d\n", f(5));
    system("pause");
    return 0;    
}

int f(int n)
{
    int x;
    /*這裡就不加關於負整數的判斷了*/
    if(n==1||n==0)
        x=1;
    else
        x=n*f(n-1);//the recursion
    return x;
}


奇怪的是,我把自定義函式加在了主函式的後面,在主函式中也沒有宣告,但是卻執行成功了。LOL

遞迴演算法的精髓是一層入一層,直至遇到滿足的結束語句,所以一般和遞迴在一起的是一些判斷語句。遞迴函式得要有終止語句。

遇到遞迴問題需要根據規律解決。

1、找到所謂的終止條件,即讓遞迴停止的條件

2、找到遞推的關係式

3、遞迴的方向要搞清楚,一般是向最終的終止條件不斷遞迴

4、遞迴 分為回推和遞推兩個階段,當遞推到終止條件時,程式會反向推回(回推)!!!!

一般會出現遞迴不像遞迴的情況,這個要小心

例題:

猴子第一天摘下N個桃子,當時就吃了一半,還不過癮,就又多吃了一個。第二天又將剩下的桃子吃掉一半,又多吃了一個。以後每天都吃前一天剩下的一半零一個。到第10天在想吃的時候就剩一個桃子了,問第一天共摘下來多少個桃子?並反向列印每天所剩桃子數。

/**************************************
*author: Yang Xu
*goals: compute a question of monkey eatting pitches by recursion
***************************************/

#include<stdio.h>
#include<process.h>

int main()
{
    /*列印最初的桃子數量*/
    printf("%d\n", f(1));
    system("pause");
    return 0;
}

/*第day天剩下的桃子數*/
int f(int day)
{
    int n;
    if(day==10)
        n=1;
    else
    {
        /*第day天(左)和第day+1天(右)所剩桃子的關係式*/
        n=(f(day+1)+1)*2;
        /*由於遞迴規律,直接倒序列印*/
        printf("第%d天所剩桃子%d個\n", day, n);
    }
    return n;
}

遞迴過程中伴隨著參量記憶體的不斷釋放與使用,需要注意,這個是函式參量的問題,這裡不多做分析

Hanoi Tower

相關推薦

C語言-演算法以及經典Hanoi

用遞迴演算法(recursion)計算階乘 codes: /************************************** *author: Yang Xu *goals: compute factorial by recursion ************

演算法經典例子程式碼實現

作者:ikownyou  來源:CSDN  原文:https://blog.csdn.net/ikownyou/article/details/65633581  版權宣告:本文為博主原創文章,轉載請附上博文連結! 一、什麼叫做遞迴? 一個過程或函式在其定義或說明中有直接

散分+快來報名“C語言指針與匯編內存地址”公開課

公開 lan shuf target dsd blank dmg userinfo gin iR歡2kaq崖居止40攘http://www.docin.com/app/user/userinfo?userid=179252984 Qsgb5V1仗mchttp://t.doc

C#_基礎_方法以及方法重載

closed gif 重新 pre num 條件 alt summary stat 方法:就是將一段代碼放在一起,進行重復調用的機制。 語法: * [private] static 返回值類型 函數名 (參數列表) * {

C語言面向物件程式設計:配置檔案解析6

在實際專案中,經常會把軟體的某些選項寫入配置檔案。 Windows 平臺上的 INI 檔案格式簡單易用,本篇文章利用《C語言面向物件程式設計(五):單鏈表實現》中實現的單鏈表,設計了一個“類” ini_parser 來讀寫 INI 格式的配置檔案。     

C語言面向物件程式設計:單鏈表實現5

 前面我們介紹瞭如何在 C 語言中引入面嚮物件語言的一些特性來進行面向物件程式設計,從本篇開始,我們使用前面提到的技巧,陸續實現幾個例子,最後呢,會提供一個基本的 http server 實現(使用 libevent )。在這篇文章裡,我們實現一個通用的資料結構:單鏈表。  

C語言面向物件程式設計:面向介面程式設計4

 Java 中有 interface 關鍵字,C++ 中有抽象類或純虛類可以與 interface 比擬,C 語言中也可以實現類似的特性。     在面試 Java 程式設計師時我經常問的一個問題是:介面和抽象類有什麼區別。  &n

C語言面向物件程式設計:繼承詳解2

在 C 語言面向物件程式設計(一)裡說到繼承,這裡再詳細說一下。     C++ 中的繼承,從派生類與基類的關係來看(出於對比 C 與 C++,只說公有繼承): 派生類內部可以直接使用基類的 public 、protected 成員(包括變數

C語言面向物件程式設計:封裝與繼承1

最近在用 C 做專案,之前用慣了 C++ ,轉回頭來用C 還真有點不適應。 C++ 語言中自帶面向物件支援,如封裝、繼承、多型等面向物件的基本特徵。 C 原本是面向過程的語言,自身沒有內建這些特性,但我們還是可以利用 C 語言本身已有的特性來實現面向物件的一些基本特徵。接下來我們就一一來細說封裝、繼

分析簡單的c語言函式編譯得到的X86彙編程式碼VS2013

檢視原始碼生成的彙編程式碼:單步除錯->除錯->視窗->反彙編   總結: ①、函式被呼叫時,實參值賦值給函式棧中的形參,使用以下步驟:        I、call函式前實參值壓棧    &n

C語言訓練-2733-小鑫の日常系列故事——石頭剪子布

Problem Description 小鑫在上幼兒園的時候,喜歡跟小夥伴健健玩石頭剪子布的遊戲 ,你能幫他們判斷誰勝誰負麼? Input 輸入有兩行,每一行都有可能為“Rock”(石頭),“Scissors”(剪子),”Cloth”(布)。第一行為小鑫的選擇,

C語言中的輸入輸出流和緩衝區重點詳解

導讀: C語言中我們用到的最頻繁的輸入輸出方式就是scanf()與printf()。 scanf(): 從標準輸入裝置(鍵盤)讀取資料,並將值存放在變數中。 printf(): 將指定的文字/字串輸出到標準輸出裝置(螢幕)。注意寬度輸出和精度 輸出控制。 C語言藉助了相應的緩衝區

C 語言中的結構體和共用體聯合體

本文主要總結了譚浩強主編的《C 程式設計》教材中結構體和共用體相關章節的內容。 在 C 語言中, 結構體(struct) 是一個或多個變數的集合,這些變數可能為不同的型別,為了處理的方便而將這些變數組織在一個名字之下。由於結構體將一組相關變數看作一個單元而不是各自獨立的實體,因此結構體有助於組織複雜的資料,

減小C語言生成的執行檔案大小的方法嵌入式

編譯過程新增 -ffunction-sections和-fdata-sections 連結過程新增選項 -Wl,--gc-sections 可以使得編譯出來的程序去除無用函式和全域性變數符號,減少程序大小。 1. 編譯過程中新增-ffunction-s

C語言之判斷100~200之間的素數質數

題目描述:編寫程式找出100~200之間的個素數,並輸出所有素數。 素數的定義:在大於1的自然數中,除了1和它本身以外不再有其他因數的數稱為質數。 所以本題的思路是將一個數除以2到本身減1,不過我們

C語言:位元組排序與記憶體四區II

一. 接著I開始: 這四個區分別對應的是程式碼區、全域性變數區、堆區、棧區。 各區的詳細說明如下: 1、棧區(stack):由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其操作方 式類似於資料結構中的棧。 2、堆區(heap: 一般

【應用CC語言實現行列式與矩陣的運算系統+原始碼

文章目錄 01 - 行列式和矩陣 1.1 - 行列式定義 1.2 - 矩陣定義 02 - 基本運算 2.1 - 行列式基本運算 2.2 - 矩陣基本運算

C語言 ,嵌入式 ,資料結構 面試題目1

1. 用預處理指令#define 宣告一個常數,用以表明1年中有多少秒(忽略閏年問題)#define SECONDS_PER_YEAR (60 * 60 * 24 * 365)UL 2. 寫一個“標準”巨集MIN,這個巨集輸入兩個引數並返回較小的一個。#define MIN(

C語言深度剖析》學習筆記----記憶體管理2

開始陸續的發一下唐老師視訊的筆記吧,順便帶一些正衝哥書的的內容。不能一下都發出來,因為內容發多了自己也受不了,而且發的都是學習視訊時候的一些筆記,可能會有一些問題不是很清晰。 先說一下C語言中的記憶體管理。 1.動態記憶體分配 ①原因:程式執行過程中,很有可能需要一些額外的

C語言程序通訊訊息佇列和共享記憶體5

歡迎加入QQ:498903810 一起交流、討論知識,裡面有大佬,也有小白,天下碼農一家親,大家一起討論進步。 訊息佇列 訊息佇列:預設傳送端將資訊放在前一個資訊後面,接收訊息端可以指