遞迴函式錯過了基本條件

計算數字的階乘是遞迴函式的典型示例。

缺少基本條件:

#include <stdio.h>

int factorial(int n)
{
       return n * factorial(n - 1);
}

int main()
{
    printf("Factorial %d = %d\n", 3, factorial(3));
    return 0;
}

典型輸出:Segmentation fault: 11

這個函式的問題是它會無限迴圈,導致分段錯誤 - 它需要一個基本條件來停止遞迴。

基本條件宣告:

#include <stdio.h>

int factorial(int n)
{
    if (n == 1) // Base Condition, very crucial in designing the recursive functions.
    {
       return 1;
    }
    else
    {
       return n * factorial(n - 1);
    }
}

int main()
{
    printf("Factorial %d = %d\n", 3, factorial(3));
    return 0;
}

樣本輸出

Factorial 3 = 6

一旦碰到條件 n 等於 1,該函式就會終止(假設 n 的初始值足夠小 - 當 int 為 32 位數量時,上限為 12)。

要遵循的規則:

  1. 初始化演算法。遞迴程式通常需要種子值才能開始。這可以通過使用傳遞給函式的引數或通過提供非遞迴的閘道器函式來實現,但是為遞迴計算設定種子值。
  2. 檢查正在處理的當前值是否與基本情況匹配。如果是,請處理並返回值。
  3. 根據更小或更簡單的子問題或子問題重新定義答案。
  4. 在子問題上執行演算法。
  5. 將結果結合在答案的表述中。
  6. 返回結果。

來源: 遞迴函式