今天分享几个递归的小程序
1.递归输出斐波那契数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int fun(int n)
{
int result=0;
if (n == 1 || n == 2){
result = 1;
}
else{
result = fun(n - 1) + fun(n - 2);
}
return result;
}
int main()
{
int n;
printf("please input the n;\n");
scanf("%d",&n);
printf("the result is:%d\n",fun(n));
system("pause");
return 0;
}
斐波那契数除前两个数外后面的数都是前面两个数之和,所以递归实现时,前两个数直接是1,后面的数都等于前两个数之和,目标数往前递归,直到条件不符,执行到开始两个数时,再一级一级的往回返。
2.递归实现n的k次方
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int n, k;
int mul(int n,int k)
{
int ret = 0;
if (k == 0){
ret = 1;
}
else{
ret = n*mul(n, k - 1);
}
return ret;
}
int main()
{
printf("请输入你想算的底数和阶数:\n");
scanf("%d %d",&n,&k);
printf("the result is:%d\n",mul(n, k));
system("pause");
return 0;
}
这道题和前面的斐波那契数大同小异都是差不多的。
3.递归返回一个一个数字各个位数之和
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int DigitSum(int n)
{
int m = 0;
int ret = 0;
if (n < 10){
ret = n;
}
else{
m = n % 10;
n = n / 10;
ret = m + DigitSum(n);
}
return ret;
}
int main()
{
int n;
printf("请输入你想组合的数字:\n");
scanf("%d",&n);
printf("the result is:%d\n",DigitSum(n));
return 0;
}
这道题就是每次就是让该数字/10是逐渐变小,n%10是取每一位,比如123/10是12再/10是1然后就会判断不符合则会返回1,然后则会一级一级往回返,则会进行12%10就会取到2,在返就是123%10就会取到3,这样每一位就都取到了。
4.递归实现字符串逆序(不能使用C函数库里的字符串操作函数!)
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
void reverse_string(char *s)
{
char tmp = *s; //用temp变量存字符串的第一个元素
int len = strlen(s); //求字符串长度
*s = *(s + len - 1); //把字符串‘\0’前的那个元素赋给第一个元素
*(s + len - 1) = '\0'; //把‘\0’前的那个字符赋值为‘\0’
if (strlen(s) > 1){ //如果字符串的长度>1则执行if里面的语句
reverse_string(s+1); //每次首指针向后移一位再递归该函数
}
*(s + len - 1) = tmp; //当条件不符时则会执行该行程序,把每次tmp存的首元素都逐个还原在中间元素的后面
}
int main()
{
char s[1024] = { 0 };
printf("请输入要逆序的字符串:\n");
gets(s);
reverse_string(s);
printf("逆序结果为:%s\n",s);
system("pause");
return 0;
}
5.递归实现strlen()字符串操作函数
#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int string_strlen1(char* s)
{
if (*s == '\0'){
return 0;
}
else{
return string_strlen1(++s) + 1;
}
}
int main()
{
char s[1024];
printf("请输入字符串:\n");
gets(s);
printf("字符串长度为:%d", string_strlen1(s));
system("pause");
return 0;
}
每次首指针++向后移动判断该元素是不是’\0’,不是的话则继续递归调用该函数,并且长度++,是的话则返回0,并一级一级的返回。
这几个问题都是递归思想里比较典型的基础问题,所以理解了这几个问题对于后面比较麻烦的递归问题就有一定的帮助。