c语言代码练习3

目录

1.打印整数每一位

2.递归和非递归求n阶乘

3.strlen函数模拟

4.逆序字符串

5.递归实现数字各位之和

6.求n的k次幂

7.斐波那契数

 8.汉诺塔问题

9.青蛙跳台阶

10.模拟循环


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);
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值