CSDN话题挑战赛第2期
参赛话题:学习笔记
学习之路,长路漫漫,写学习笔记的过程就是把知识讲给自己听的过程。这个过程中,我们去记录思考的过程,便于日后复习,梳理自己的思路。学习之乐,独乐乐,不如众乐乐,把知识讲给更多的人听,何乐而不为呢?
目录
一.字符串逆序(递归实现)
问题详细
编写一个函数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);
}
运算结果是