首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

C 語言遞迴輸出 99 乘法表:不使用迴圈的完整實作與邏輯詳解

     編輯:程式設計綜合問答

題目要求

  • C 語言
  • 遞迴函數
  • 輸出 99 乘法表 (1×1 到 9×9)
  • 不得使用迴圈

遞迴策略:雙計數器模擬雙層迴圈

使用兩個參數追蹤狀態:

  • `row`:當前行 (被乘數,1~9)
  • `col`:當前列 (乘數,1~row)

邏輯:列遞增至 `row` → 換行、行遞增、列重置 1 → 行超過 9 終止

完整程式碼 (含詳細註解)

#include 

/**
 * 遞迴輸出 99 乘法表
 * @param row 當前行 (1-9)
 * @param col 當前列 (1-row)
 */
void printMultiplicationTable(int row, int col) {
    // 終止條件:行超過 9
    if (row > 9) return;

    // 輸出當前乘法式
    printf("%d * %d = %d\t", row, col, row * col);

    // 判斷是否換行、移至下一行
    if (col >= row) {
        // 當前行結束:換行、下一行、列重置為 1
        printf("\n");
        printMultiplicationTable(row + 1, 1);
    } else {
        // 同行下一列
        printMultiplicationTable(row, col + 1);
    }
}

int main() {
    // 從第 1 行、第 1 列開始
    printMultiplicationTable(1, 1);
    return 0;
}

執行流程追蹤 (前幾步)

遞迴層級rowcol輸出下一步動作
1111*1=1\tcol>=row → 換行, print(2,1)
2212*1=2\tcol
3222*2=4\tcol>=row → 換行, print(3,1)
4313*1=3\tprint(3,2)
5323*2=6\tprint(3,3)
6333*3=9\t換行, print(4,1)
...............
45999*9=81\t換行, print(10,1)
46101-row>9 → return (結束)

輸出結果

1 * 1 = 1	
2 * 1 = 2	2 * 2 = 4	
3 * 1 = 3	3 * 2 = 6	3 * 3 = 9	
4 * 1 = 4	4 * 2 = 8	4 * 3 = 12	4 * 4 = 16	
5 * 1 = 5	5 * 2 = 10	5 * 3 = 15	5 * 4 = 20	5 * 5 = 25	
6 * 1 = 6	6 * 2 = 12	6 * 3 = 18	6 * 4 = 24	6 * 5 = 30	6 * 6 = 36	
7 * 1 = 7	7 * 2 = 14	7 * 3 = 21	7 * 4 = 28	7 * 5 = 35	7 * 6 = 42	7 * 7 = 49	
8 * 1 = 8	8 * 2 = 16	8 * 3 = 24	8 * 4 = 32	8 * 5 = 40	8 * 6 = 48	8 * 7 = 56	8 * 8 = 64	
9 * 1 = 9	9 * 2 = 18	9 * 3 = 27	9 * 4 = 36	9 * 5 = 45	9 * 6 = 54	9 * 7 = 63	9 * 8 = 72	9 * 9 = 81	

複雜度與堆疊分析

  • 總遞迴呼叫次數:45 次 (等於乘法式總數) + 9 次換行呼叫 + 1 次終止 = **55 次**
  • 最大堆疊深度:9 (行) + 9 (列) ≈ **18 層** (極安全)
  • 時間:O(1) 固定 45 次輸出

關鍵設計點

  • 雙參數狀態:`row`、`col` 完全替代雙層 `for` 迴圈索引
  • 尾遞迴:兩個遞迴呼叫均為函數最後動作,編譯器 `-O2` 可優化為迴圈
  • 格式控制:`\t` 對齊、行末 `\n` 換行
  • 邊界條件:`col >= row` 觸發換行、`row > 9` 終止

延伸:輸出完整長方形乘法表 (1×1 ~ 9×9 全輸出)


void printFullTable(int row, int col) {
    if (row > 9) return;
    if (col > 9) {
        printf("\n");
        printFullTable(row + 1, 1);
        return;
    }
    printf("%d * %d = %d\t", col, row, col * row); // 注意順序
    printFullTable(row, col + 1);
}

總結

遞迴雙計數器 (`row`, `col`) 完美模擬雙層迴圈輸出 99 乘法表。**55 次遞迴呼叫、最大深度 18、尾遞迴優化友善**,是展示「遞迴替代巢狀迴圈」的經典教學範例。實務中請直接用 `for` 迴圈。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved