日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

C語言深入分析遞歸函數的實現_C 語言

作者:清風自在?流水潺潺 ? 更新時間: 2022-06-16 編程語言

一、遞歸的數學思想

遞歸是一種數學上分而自治的思想

遞歸需要有邊界條件

  • 當邊界條件不滿足時,遞歸繼續進行
  • 當邊界條件滿足時,遞歸停止

遞歸將大型復雜問題轉化為與原問題相同但規模較小的問題進行處理。

二、遞歸函數

函數體內部可以調用自己

遞歸函數

  • 函數體中存在自我調用的函數

遞歸函數是遞歸的數學思想在程序設計中的應用

  • 遞歸函數必須有遞歸出口
  • 函數的無限遞歸將導致程序棧溢出而崩潰

三、遞歸函數設計技巧

遞歸模型的一般表示法

四、遞歸函數設計示例一

用遞歸的方法編寫函數求字符串長度

代碼如下:

#include <stdio.h>
 
int strlen_r(const char* s)
{
    if( *s )
    {
        return 1 + strlen_r(s+1);
    }
    else
    {
        return 0;
    }
}
 
int main()
{
    printf("%d\n", strlen_r("abc"));
    printf("%d\n", strlen_r(""));
    
    return 0;
}

輸出結果如下:

五、遞歸函數設計示例二

斐波拉契數列遞歸解法

1,1,2,3,5,8,13,21,...

代碼如下:

#include <stdio.h>
 
int fac(int n)
{
    if( n == 1 )
    {
        return 1;
    }
    else if( n == 2 )
    {
        return 1;
    }
    else
    {
        return fac(n-1) + fac(n-2);
    }
    
    return -1;
}
 
int main()
{
    printf("%d\n", fac(1));
    printf("%d\n", fac(2));
    printf("%d\n", fac(9));
    
    return 0;
}

輸出結果如下:

六、遞歸函數設計示例三

漢諾塔問題

  • 將木塊借助 B 柱由 A 柱移動到 C 柱
  • 每次只能移動一個木塊
  • 只能出現小木塊在大木塊之上

漢諾塔問題分解

  • 將 n-1 個木塊借助 C 柱由 A 柱移動到 B 柱
  • 將最底層的唯一木塊直接移動到 C 柱
  • 將 n-1 個木塊借助 A 柱由 B 柱移動到 C 柱

代碼如下:

#include <stdio.h>
 
void han_move(int n, char a, char b, char c)
{
    if( n == 1 )
    {
        printf("%c --> %c\n", a, c);
    }
    else
    {
        han_move(n-1, a, c, b);
        han_move(1, a, b, c);
        han_move(n-1, b, a, c);
    }
}
 
int main()
{
    han_move(3, 'A', 'B', 'C');
    
    return 0;
}

輸出結果如下:

七、小結

  • 遞歸是一種將問題分而自治的思想
  • 用遞歸解決問題首先要建立遞歸的模型
  • 遞歸解法必須要有邊界條件,否則無解

原文鏈接:https://blog.csdn.net/weixin_43129713/article/details/124164731

欄目分類
最近更新