C语言常见推理题
#include <string.h>
// 1. 阶乘计算
int factorial(int n) {
if (n <= 1) return 1;
return n * factorial(n - 1);
}
// 2. 斐波那契数列
int fibonacci(int n) {
if (n <= 1) return n;
return fibonacci(n - 1) + fibonacci(n - 2);
}
// 3. 数组求和
int array_sum(int arr[], int n) {
if (n <= 0) return 0;
return arr[n - 1] + array_sum(arr, n - 1);
}
// 4. 字符串反转
void reverse_string(char *str, int start, int end) {
if (start >= end) return;
char temp = str[start];
str[start] = str[end];
str[end] = temp;
reverse_string(str, start + 1, end - 1);
}
// 5. 十进制转二进制
void decimal_to_binary(int n) {
if (n > 1) decimal_to_binary(n / 2);
printf("%d", n % 2);
}
// 6. 汉诺塔问题
void hanoi(int n, char from, char to, char aux) {
if (n == 1) {
printf("移动盘子 1 从 %c 到 %c\n", from, to);
return;
}
hanoi(n - 1, from, aux, to);
printf("移动盘子 %d 从 %c 到 %c\n", n, from, to);
hanoi(n - 1, aux, to, from);
}
// 7. 判断回文字符串
int is_palindrome(char *str, int start, int end) {
if (start >= end) return 1;
if (str[start] != str[end]) return 0;
return is_palindrome(str, start + 1, end - 1);
}
// 8. 最大公约数
int gcd(int a, int b) {
if (b == 0) return a;
return gcd(b, a % b);
}
// 9. 二分查找
int binary_search(int arr[], int left, int right, int target) {
if (left > right) return -1;
int mid = left + (right - left) / 2;
if (arr[mid] == target) return mid;
if (arr[mid] > target) return binary_search(arr, left, mid - 1, target);
return binary_search(arr, mid + 1, right, target);
}
int main() {
printf("=== C语言递归编程示例 ===\n\n");
// 测试阶乘
printf("1. 5的阶乘: %d\n", factorial(5));
// 测试斐波那契
printf("2. 第8个斐波那契数: %d\n", fibonacci(8));
// 测试数组求和
int arr[] = {1, 2, 3, 4, 5};
printf("3. 数组求和: %d\n", array_sum(arr, 5));
// 测试字符串反转
char str[] = "hello";
printf("4. 原字符串: %s\n", str);
reverse_string(str, 0, strlen(str) - 1);
printf(" 反转后: %s\n", str);
// 测试十进制转二进制
printf("5. 10的二进制: ");
decimal_to_binary(10);
printf("\n");
// 测试汉诺塔
printf("6. 3层汉诺塔解决方案:\n");
hanoi(3, 'A', 'C', 'B');
// 测试回文判断
char palindrome[] = "racecar";
printf("7. '%s' 是回文: %s\n", palindrome,
is_palindrome(palindrome, 0, strlen(palindrome) - 1) ? "是" : "否");
// 测试最大公约数
printf("8. GCD(48, 18): %d\n", gcd(48, 18));
// 测试二分查找
int sorted_arr[] = {1, 3, 5, 7, 9, 11, 13};
int target = 7;
int result = binary_search(sorted_arr, 0, 6, target);
printf("9. 在排序数组中查找 %d: %s\n", target,
result != -1 ? "找到" : "未找到");
return 0;
}
