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;

}

相关推荐
毕设源码-邱学长3 小时前
【开题答辩全过程】以 基于Java的学校住宿管理系统的设计与实现为例,包含答辩的问题和答案
java·开发语言
busideyang4 小时前
为什么推挽输出不能接收串口数据,而准双向口可以?
c语言·stm32·单片机·嵌入式硬件·嵌入式
炸膛坦客4 小时前
单片机/C/C++八股:(二十)指针常量和常量指针
c语言·开发语言·c++
爱编码的小八嘎4 小时前
C语言完美演绎4-8
c语言
I_LPL5 小时前
hot100贪心专题
数据结构·算法·leetcode·贪心
兑生5 小时前
【灵神题单·贪心】1481. 不同整数的最少数目 | 频率排序贪心 | Java
java·开发语言
daidaidaiyu5 小时前
一文学习 Spring 声明式事务源码全流程总结
java·spring
颜酱5 小时前
DFS 岛屿系列题全解析
javascript·后端·算法
WolfGang0073215 小时前
代码随想录算法训练营 Day16 | 二叉树 part06
算法
炸膛坦客6 小时前
单片机/C/C++八股:(十九)栈和堆的区别?
c语言·开发语言·c++