c語言遞歸演算法案例,遞歸演算法c語言實例

本文目錄一覽:

C語言中自我遞歸的幾個例子

遞歸主要元素:入口,遞歸和結束。在定義遞歸函數時將這三個元素考慮進去就行;如: double callnext(int n)

{

if(n1) return callnext(n-1)+3;

else return 1;

}

int main()

{

int m;

scanf(“%d”,m);

printf(“result=%f”,callnext(m));

return 0;

}

入口:callnext(m);遞歸:if(n1) return callnext(n-1)+3中的callnext(n-1);結束:else return 1;整個執行流程:callnext(m) 調用 callnext(m-1);callnext(m-1)調用callnext(m-1-1)。。。

callnext(2)調用callnext(1);callnext(1)=1;結束;

遞歸函數的例子

這個行嗎:

求1+2+……+100的和

先分析一下。第一遞歸變數的問題,從題目上看應該取1,2,……,100這些變數的值作為遞歸的條件;第二就是如何終止的問題,從題目上看應該是當數為100的時候就不能往下加了。那麼我們試著寫一下程序。

int add(int);

main()

{

int num=1,sn;

sn=add(num);

printf(“%d\n”,sn);

getch();

}

int add(int num)

{

static int sn;

sn+=num;

if(num==100) return sn;

add(++num);

}

分析一下程序:前調用add(1),然後在子函數中把這個1加到sn上面。接著調用add(2),再把sn加2上來。這樣一直到100,到了100的時候,先加上來,然後發現滿足了if條件,這時返回sn的值,也就是1+2+……+100的值了。

c語言 函數遞歸調用的簡單例子

舉一個用遞歸調用函數求輸入非負整數的階乘的例子,如下:

//#include “stdafx.h”//If the vc++6.0, with this line.

#include “stdio.h”

int fact(int n){

    if(n==1 || n==0) return 1;

    else return n*fact(n-1);

}

int main(void){

    int x;

    while(1){

        printf(“Input x(int 12=x=0)…\nx=”);

        if(scanf(“%d”,x),x=0  x=12)//x12時會使結果溢出

            break;

        printf(“Error,redo: “);

    }

    printf(“%d! = %d\n”,x,fact(x));

    return 0;

}

c語言算n的階乘的遞歸演算法

思路:遞歸求階乘函數,如果輸入的參數等於1則返回1,否則返回n乘以該函數下次遞歸。

參考代碼:

#includestdio.h

int fun(int n)

{

if(n==1||n==0) return 1;//如果參數是0或者1返回1

return n*fun(n-1);//否則返回n和下次遞歸的積

}

int main()

{

int n;

scanf(“%d”,n);

printf(“%d\n”,fun(n));

return 0;

}

/*

5

120

*/

C語言如何用遞歸演算法求1!+2!+3!+…n!

#includestdio.h

float fun(int n)

{

if(n==1) return 1;//如果n=1則直接返回1

return n*fun(n-1);//否則返回n*fun(n-1),以此計算n的階乘,這條語句就是遞歸體

}

void main()

{

int i;

float sum=0;

for(i=1;i=n;i++){

sum+=fun(i); //循環調用,用sum累計

}

printf(“sum=%.2f\n”,sum);

}

C語言遞歸演算法?

本人學c++,c的語法已經淡忘了,但是遞歸不管什麼語言都是一個原理

其實簡單一點來說就像數學裡面的數列的通項公式:

例如一個數列是2,4,6,8,10……

很容易就可以得到通項公式是a[n]=2*n n是大於0的整數

你肯定學過這個數列的另外一種表示方式就是: a[1]=2, a[n]=a[n-1]+2 n是大於1的整數

其實這就是一個遞歸的形式,只要你知道初始項的值,未知項和前幾項之間的關係就可以知道整個數列。

程序例子:比如你要得到第x項的值

普通循環:

for(int i=1; i=n; i++)

if (i == x)

cout 2*i; /*cout 相當於 c裡面的printf,就是輸出.*/

遞歸:

int a(int x) {

if (x = 1)

return 2; /* 第一項那肯定是2了,這個也是遞歸的終止條件! */

else return a(x-1)+2; /* 函數自身調用自身是遞歸的一個特色 */

比如x=4,那麼用數學表示就是a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2

其實遞歸方法最接近自然,也是最好思考的一個方法,難點就是把對象建模成遞歸形式,但是好多問題本身就是以遞歸形式出現的。

普通遞歸就是數據結構上的堆棧,先進後出。

例如上面x=4,把a(4)放入棧底,然後放入a(3),然後a(2),a(1),a(1)的值已知,出棧,a(1)=2,a(2)出棧a(2)=a(1)+2=2+2=4,a(3)出棧a(3)=a(2)+2=(a(1)+2)+2=6,a(4)出棧a(4)=a(3)+2=(a(2)+2)+2=((a(1)+2)+2)+2=8

再比如樓上的階乘例子,當n=0 或 1時,0!=1,1!=1,這個是階乘的初始值,也是遞歸的終止條件。然後我們知道n!=n*(n-1)!,當n1時,這樣我們又有了遞歸形式,又可以以遞歸演算法設計程序了。(樓上已給出譚老的程序,我就不寫了)。

我給出一種優化的遞歸演算法—尾遞歸。

從我給出的第一演算法可以看出,先進棧再出棧,遞歸的效率是很低的。速度上完全比不上迭代(循環)。但是尾遞歸引入了一個新的函數參數,用這個新的函數參數來記錄中間值.

普通遞歸階乘fac(x),就1個x而已,尾遞歸用2個參數fac(x,y),y存放階乘值。

所以譚老的程序就變成

// zysable’s tail recursive algorithm of factorial.

int fac(int x, int y) {

if (x == 1)

return y;

else return fac(x-1, y*x);}

int ff(int x) {

if (x == 0)

return 1;

else return fac(x,1);}

對於這個程序我們先看函數ff,函數ff其實是對fac的一個封裝函數,純粹是為了輸入方便設計的,通過調用ff(x)來調用fac(x,1),這裡常數1就是當x=1的時候階乘值了,我通過走一遍當x=3時的值即為3!來說明一下。

首先ff(3),x!=0,執行fac(3,1).第一次調用fac,x=3,y=1,x!=1,調用fac(x-1,y*x),新的x=2,y=3*1=3,這裡可以看到,y已經累計了一次階乘值了,然後x還是!=1,繼續第三次調用fac(x-1,y*x),新的x=1,y=2*3=6,然後x=1了,返回y的值是6,也就是3!.你會發現這個遞歸更類似於迭代了。事實上我們用了y記錄了普通遞歸時候,出棧的乘積,所以減少了出棧後的步驟,而且現在世界上很多程序員都在倡議用尾遞歸取消循環,因為有些在很多解釋器上尾遞歸比迭代稍微效率一點.

基本所有普通遞歸的問題都可以用尾遞歸來解決。

一個問題以遞歸來解決重要的是你能抽象出問題的遞歸公式,只要遞歸公式有了,你就可以放心大膽的在程序中使用,另外一個重點就是遞歸的終止條件;

其實這個終止條件也是包含在遞歸公式裡面的,就是初始值的定義。英文叫define initial value. 用普通遞歸的時候不要刻意讓自己去人工追蹤程序,查看運行過程,有些時候你會發現你越看越不明白,只要遞歸公式轉化成程序語言正確了,結果必然是正確的。學遞歸的初學者總是想用追蹤程序運行來讓自己來了解遞歸,結果越弄越糊塗。

如果想很清楚的了解遞歸,有種計算機語言叫scheme,完全遞歸的語言,因為沒有循環語句和賦值語句。但是國內人知道的很少,大部分知道是的lisp。

好了,就給你說到這裡了,希望你能學好遞歸。

PS:遞歸不要濫用,否則程序極其無效率,要用也用尾遞歸。by 一名在美國的中國程序員zysable。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/194834.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-02 14:41
下一篇 2024-12-02 14:41

相關推薦

  • 蝴蝶優化演算法Python版

    蝴蝶優化演算法是一種基於仿生學的優化演算法,模仿自然界中的蝴蝶進行搜索。它可以應用於多個領域的優化問題,包括數學優化、工程問題、機器學習等。本文將從多個方面對蝴蝶優化演算法Python版…

    編程 2025-04-29
  • Python實現爬樓梯演算法

    本文介紹使用Python實現爬樓梯演算法,該演算法用於計算一個人爬n級樓梯有多少種不同的方法。 有一樓梯,小明可以一次走一步、兩步或三步。請問小明爬上第 n 級樓梯有多少種不同的爬樓梯…

    編程 2025-04-29
  • AES加密解密演算法的C語言實現

    AES(Advanced Encryption Standard)是一種對稱加密演算法,可用於對數據進行加密和解密。在本篇文章中,我們將介紹C語言中如何實現AES演算法,並對實現過程進…

    編程 2025-04-29
  • Python生成隨機數的應用和實例

    本文將向您介紹如何使用Python生成50個60到100之間的隨機數,並將列舉使用隨機數的幾個實際應用場景。 一、生成隨機數的代碼示例 import random # 生成50個6…

    編程 2025-04-29
  • 學習Python對學習C語言有幫助嗎?

    Python和C語言是兩種非常受歡迎的編程語言,在程序開發中都扮演著非常重要的角色。那麼,學習Python對學習C語言有幫助嗎?答案是肯定的。在本文中,我們將從多個角度探討Pyth…

    編程 2025-04-29
  • Harris角點檢測演算法原理與實現

    本文將從多個方面對Harris角點檢測演算法進行詳細的闡述,包括演算法原理、實現步驟、代碼實現等。 一、Harris角點檢測演算法原理 Harris角點檢測演算法是一種經典的計算機視覺演算法…

    編程 2025-04-29
  • Python被稱為膠水語言

    Python作為一種跨平台的解釋性高級語言,最大的特點是被稱為”膠水語言”。 一、簡單易學 Python的語法簡單易學,更加人性化,這使得它成為了初學者的入…

    編程 2025-04-29
  • 數據結構與演算法基礎青島大學PPT解析

    本文將從多個方面對數據結構與演算法基礎青島大學PPT進行詳細的闡述,包括數據類型、集合類型、排序演算法、字元串匹配和動態規劃等內容。通過對這些內容的解析,讀者可以更好地了解數據結構與算…

    編程 2025-04-29
  • 瘦臉演算法 Python 原理與實現

    本文將從多個方面詳細闡述瘦臉演算法 Python 實現的原理和方法,包括該演算法的意義、流程、代碼實現、優化等內容。 一、演算法意義 隨著科技的發展,瘦臉演算法已經成為了人們修圖中不可缺少…

    編程 2025-04-29
  • OpenJudge答案1.6的C語言實現

    本文將從多個方面詳細闡述OpenJudge答案1.6在C語言中的實現方法,幫助初學者更好地學習和理解。 一、需求概述 OpenJudge答案1.6的要求是,輸入兩個整數a和b,輸出…

    編程 2025-04-29

發表回復

登錄後才能評論