C语言函数解决问题:1.字符串逆序(递归实现)2.计算一个数的每位之和(递归实现) 3.递归实现n的k次方

CSDN话题挑战赛第2期
参赛话题:学习笔记

学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?

目录

一.字符串逆序(递归实现)

问题详细

代码一(不符合题意)

代码二(编写求字符串长度函数,未使用递归)

代码(最终正解)

二.计算一个数的每位之和(递归实现)

问题描述

解决思路

​编辑代码

三. 递归实现n的k次方

问题描述

解决思路

代码


一.字符串逆序(递归实现)

问题详细

编写一个函数reverse_string(char * string)(递归实现),实现:将参数字符串中的字符反向排列。
要求:不能使用C函数库中的字符串操作函数。

代码一(不符合题意)

#include<stdio.h>
#include<string.h>
char reverse_string(char* arr)
{
    int left=0;
    int right=strlen(arr)-1;//数组从0开始
    while(left<=right)
    {
        char temp=arr[left];
        arr[left]=arr[right];
        arr[right]=temp;
        left++;
        right--;
    }

}
int main()
{
    char arr[]="abcdef";
    reverse_string(arr);
    printf("%s ",arr);
    return 0;

}

这种方法最容易想到,但是不符合题意,因为在这个代码里面用来string.h这个库函数,题目要求是要不引用如何库函数,所以还需要改进,关于求字符串长度我们以前也讲过很多例子,我们可以用指针自己写一个求字符串长度的函数来试试

代码二(编写求字符串长度函数,未使用递归)

#include<stdio.h>
int my_strlen(char* arr)//利用指针写一个求字符串的函数
{
    int count=0;
    while(*arr!='\0')//字符串结束标志是'\0'
    {
        count++;
        arr++;
    }
    return count;
}

char reverse_string(char* arr)
{

    int left=0;
    int right=my_strlen(arr)-1;//数组从0开始,这里再调用my_strlen函数
    while(left<=right)
    {
        char temp=arr[left];
        arr[left]=arr[right];
        arr[right]=temp;
        left++;
        right--;
    }

}
int main()
{
    char arr[]="abcdef";
    reverse_string(arr);
    printf("%s ",arr);
    return 0;

}

写到这里仍然没有达到题意,他那个函数是要求用递归来实现,好,那我们就需要想想递归实现需要达到的两个条件:1、有限制条件;2、不断地接近限制条件。那我们带着这个思路现在来分析这个题目,如下图:

 这里特别需要注意一点,当我们将最后一个字符移到第一位时,第一位不能直接就放到最后一位,因为我们后续的递归,也就是剩下的字符串接着转换的时候需要‘\0’来做判断标志,所以在这之前我们先要将‘\0’前移一位,再把第一位移到最后一位。

代码(最终正解)

#include<stdio.h>
int my_strlen(char* arr)//利用指针写一个求字符串的函数
{
    int count=0;
    while(*arr!='\0')//字符串结束标志是'\0'
    {
        count++;
        arr++;
    }
    return count;
}

char reverse_string(char* arr)
{
    char temp=arr[0];
    int len=my_strlen(arr);
    arr[0]=arr[len-1];
    arr[len-1]='\0';
    if (my_strlen(arr+1)>=2)//这里就是说剩余的字符串是否大于等于2
        reverse_string(arr+1);//剩余的字符串接着调用
    arr[len-1]=temp;
    

}
int main()
{
    char arr[]="abcdef";
    reverse_string(arr);
    printf("%s ",arr);
    return 0;

}

运行结果是

二.计算一个数的每位之和(递归实现)

问题描述

一个递归函数Digitsum(n),输入一个非负整数,返回组成它的数字之和,例如,调用DigitSum(1729),则应该返回1+7+2+9,它的和是19
输入:1729,输出:19

解决思路



代码

#include<stdio.h>
int DigitSum(unsigned int num)
{
    if(num>9)
    {
        return DigitSum(num/10)+num%10;
    }
    else
        return num;
}
int main()
{
    unsigned int num=0;
    scanf("%d",&num);
    int ret=DigitSum(num);
    printf("ret=%d\n",ret);
}

运行结果

三. 递归实现n的k次方

问题描述

编写一个函数实现n的k次方,使用递归实现。

解决思路

这个题比较简单

代码

#include<stdio.h>
double pow(int n,int k)
{
    if(k>0)
    {
        return n*pow(n,k-1);
    }
    else if(k<0)
    {
        return (1.0/(pow(n,-k)));//注意这里要取-k,因为前提是k<0,这样一来就相当于1.0除以n的k次方
    }
    else//只有k=0的情况
        return 1;

}
int main()
{
    int n=0;
    int k=0;
    scanf("%d %d",&n,&k);
    double ret=pow(n,k);
    printf("%d的%d次方是:%lf",n,k,ret);
}

 运算结果是

 

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阳862

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值