目录
1.打印整数每一位
用递归的方式,实现打印一个整数的每一位的功能。
#include <stdio.h>
void print(unsigned int n) {
if (n > 9) {
print(n / 10);
}
printf("%u\t", n % 10);
}
int main(){
unsigned int n;
scanf_s("%u", &n);
print(n);
return 0;
}
2.递归和非递归求n阶乘
#include <stdio.h>
int fac1(int n) //递归
{
if (n == 0 || n == 1) {
return 1;
}
return n * fac1(n - 1);
}
int fac2(int n)//非递归
{
if (n == 0 || n == 1) {
return 1;
}
int a = 1;
int i = 1;
for (i = 1; i <= n; i++) {
a = a * i;
}
return a;
}
int main(){
int n;
scanf_s("%d", &n);
printf("%d\n",fac1(n));
printf("%d\n", fac2(n));
return 0;
}
3.strlen函数模拟
不创建临时变量,求字符串长度
#include <stdio.h>
int my_strlen(char* str)//递归
{
if (*str != '\0')
return 1 + my_strlen(str + 1);
else
return 0;
}
int my_strlen2(char* str)//非递归
{
int count = 0;
while (*str != '\0') {
count++;
str++;
}
return count;
}
int main(){
char arr[] = "abc";
printf("%d\n", my_strlen(arr));
printf("%d\n", my_strlen2(arr));
return 0;
}
4.逆序字符串
不开辟额外空间的情况下,不使用字符串库函数,递归实现字符串反向排列,而不是倒序打印。
#include <stdio.h>
void reverse_string(char* ch)//递归
{
char* left = ch;
char* right = ch + strlen(ch) - 1;
if (*ch != '\0') {
char temp = *left;
*left = *right;
*right = '\0';
reverse_string(ch + 1);
*right = temp;
}
}
void reverse_string2(char* ch)//指针
{
char* left = ch;
char* right = ch + strlen(ch) - 1;
while (left < right) {
char temp = *left;
*left = *right;
*right = temp;
left++;
right--;
}
}
void reverse_string3(char* ch)//数组
{
int left = 0;
int right = strlen(ch) - 1;
while (left < right) {
char temp = ch[left];
ch[left] = ch[right];
ch[right] = temp;
left++;
right--;
}
}
int main(){
char arr[] = "abcdef";
reverse_string3(arr);
printf("%s\n", arr);
return 0;
}
5.递归实现数字各位之和
写一个递归函数DigitSum()
,输入一个非负整数,返回组成它的数字之和
#include <stdio.h>
int DigitSum(int n) {
if (n > 9) {
return DigitSum(n / 10) + n % 10;
}
else
return n;
}
int main(){
int n;
scanf_s("%d", &n);
printf("%d", DigitSum(n));
return 0;
}
6.求n的k次幂
输入两个整数分别代表底数和次幂,递归实现n的k次幂的功能。
#include <stdio.h>
int pow(int n,int k) {
if (k > 0)
return n * pow(n, k - 1);
else
return 1;
}
int main(){
int n,k;
scanf_s("%d,%d", &n,&k);
printf("%d", pow(n,k));
return 0;
}
7.斐波那契数
#include <stdio.h>
int fib(int n) //递归可以求解,但是效率太低,多次重复计算
{
if (n <= 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
int fib2(int n)
{
if (n <= 2)
return 1;
int a = 1;
int b = 1;
int c = 0;
int i = 1;
while (n>2) {
c = a + b;
a = b;
b = c;
n--;
}
return c;
}
int main(){
int n;
scanf_s("%d", &n);
printf("%d\n", fib(n));
printf("%d\n", fib2(n));
return 0;
}
8.汉诺塔问题
【C语言】递归详解汉诺塔问题_hanoi塔递归算法c语言_安 度 因的博客-CSDN博客
#include <stdio.h>
int hanoi(int n) {
if (n == 1)
return 1;
return 2 * hanoi(n - 1) + 1;
}
void hanoi_move(int n, char a, char b, char c)
{
if (n == 1)
printf("%c->%c\n", a, c);
else{
hanoi_move(n - 1, a, c, b);
printf("%c->%c\n", a, c);
hanoi_move(n - 1, b, a, c);
}
}
int main(){
int n;
scanf_s("%d", &n);
printf("移动次数%d\n", hanoi(n));
hanoi_move(n, 'a', 'b', 'c');
return 0;
}
9.青蛙跳台阶
C语言——青蛙跳台阶问题详解(递归)_一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶,也可以跳上3阶台阶……也可以跳_平凡的小苏的博客-CSDN博客
青蛙一次可以跳一级台阶,也可以跳两级台阶。求该青蛙跳n级台阶共有多少种跳法?
#include <stdio.h>
int f(int n) {
if (n == 1)
return 1;
if (n == 2)
return 2;
else
return f(n - 1) + f(n - 2);
}
int main(){
int n;
scanf_s("%d", &n);
printf("%d", f(n));
return 0;
}
青蛙一次可以跳一级台阶,也可以跳两级台阶,……,也可以跳n级台阶,求该青蛙跳上n级台阶的跳法种数。
#include <stdio.h>
int f(int n) {
if (n == 1)
return 1;
if (n == 2)
return 2;
if (n == 3)
return 4;
else
return f(n - 1) + f(n - 2)+f(n - 3);
}
int main(){
int n;
scanf_s("%d", &n);
printf("%d", f(n));
return 0;
}
10.模拟循环
在不使用循环的情况下,使用递归按升序输出1到100的所有整数
#include <stdio.h>
void print(int n)
{
if (n <= 100) {
printf("%d\t", n);
print(n+1);
}
}
int main() {
int n = 1;
print(n);
}
#include <stdio.h>
void print(int n)
{
if (n >=1) {
print(n - 1);
printf("%d\t", n);
}
}
int main() {
int n = 100;
print(n);
}