遞歸是解決進制轉換問題的經典方法,利用「除基取餘、逆序輸出」的數學原理,配合遞歸調用棧的後進先出特性,自然實現逆序輸出。本文詳細解析算法邏輯、代碼實現與邊界處理。
十進制整數 N 轉二進制:
例:13 → 1101
13 / 2 = 6 ... 1 6 / 2 = 3 ... 0 3 / 2 = 1 ... 1 1 / 2 = 0 ... 1 讀餘數逆序:1101
#include <stdio.h>
#include <stdlib.h>
// 遞歸函數:打印 num 的二進制表示
void print_binary(int num) {
if (num == 0) {
return; // 基線條件:遞歸終止
}
print_binary(num / 2); // 遞歸處理高位
printf("%d", num % 2); // 回溯時打印低位(逆序輸出關鍵)
}
int main() {
int num = 0;
printf("請輸入要轉換的十進制非負整數: ");
scanf("%d", &num);
if (num < 0) {
printf("暫不支持負數轉換\n");
return 1;
}
printf("二進制表示: ");
if (num == 0) {
printf("0"); // 特殊情況:0 直接輸出
} else {
print_binary(num);
}
printf("\n");
system("pause"); // Windows 專用,防控制台關閉
return 0;
}
print_binary(6)
│
├─ print_binary(3) // 6/2=3
│ │
│ ├─ print_binary(1) // 3/2=1
│ │ │
│ │ ├─ print_binary(0) // 1/2=0 → 返回
│ │ │
│ │ └─ printf("%d", 1%2) → 輸出 '1'
│ │
│ └─ printf("%d", 3%2) → 輸出 '1'
│
└─ printf("%d", 6%2) → 輸出 '0'
最終輸出: 110 (即 6 的二進制)
| 要素 | 本例體現 | |
|---|---|---|
| 基線條件 | num == 0 直接返回 | |
| 遞歸調用 | print_binary(num / 2) 縮小問題規模 | |
| 回溯處理 | printf("%d", num % 2) 在返回時輸出 |
| 維度 | 遞歸版 | 迭代版 |
|---|---|---|
| 代碼簡潔度 | ★★★★★ | ★★★☆☆ |
| 空間複雜度 | O(log n) 棧幀 | O(log n) 顯式數組 |
| 可讀性 | 高(數學定義直譯) | 中(需理解逆序邏輯) |
| 棧溢出風險 | 極大數理論存在 | 無 |
| 性能 | 函數調用開銷 | 略快 |