1.递归和非递归分别实现求n的阶乘
2.递归方式实现打印一个整数的每一位
3.编写一个函数实现n的k次方,使用递归实现
4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
5.递归实现将参数字符串中的字符反向排列
第五题的非递归实现
6.递归和非递归分别实现strlen
1.递归和非递归分别实现求n的阶乘
#include<stdio.h>
递归
int factorial(int n)
{
if (1 == n)
return 1;
else
return n * factorial(n - 1);
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = factorial(n);
printf("%d", ret);
return 0;
}
非递归
int factorial(int n)
{
int sum = 1;
for (int i = 1; i <= n; i++)
{
sum *= i;
}
return sum;
}
int main()
{
int n = 0;
int ret = 0;
scanf("%d", &n);
ret = factorial(n);
printf("%d", ret);
return 0;
}
2.递归方式实现打印一个整数的每一位
#include<stdio.h>
void recursionprint(int num)
{
if (num / 10 == 0)
{
printf("%d ", num);
}
else
{
printf("%d ", num % 10);
recursionprint(num / 10);
}
}
void recursionprint(int num)
{
if (num > 9)
recursionprint(num / 10);
printf("%d ", num % 10);
}
int main()
{
int num = 0;
scanf("%d", &num);
recursionprint(num);
return 0;
}
3.编写一个函数实现n的k次方,使用递归实现
#include<stdio.h>
double fun(int n, int k)
{
if (k > 0)
{
return n * fun(n, k - 1);
}
else if (k == 0)
{
return 1;
}
else
{
return (1.0 / fun(n, -k));
}
}
int main()
{
int n = 0;
int k = 0;
double ret = 0;
scanf("%d%d", &n, &k);
ret = fun(n, k);
printf("%lf", ret);
return 0;
}
4.写一个递归函数DigitSum(n),输入一个非负整数,返回组成它的数字之和
例如,调用DigitSum(1729),则应该返回1 + 7 + 2 + 9,它的和是19
输入:1729,输出:19
#include<stdio.h>
int DigitSum(int m)
{
if (m > 9)
{
return m % 10 + DigitSum(m / 10);
}
else
{
return m;
}
}
int main()
{
int ret = 0;
int n = 0;
scanf("%d", &n);
ret = DigitSum(n);
printf("%d", ret);
return 0;
}
5.编写一个函数 reverse_string(char* string)(递归实现)
实现:将参数字符串中的字符反向排列,不是逆序打印!
要求:不能使用C函数库中的字符串操作函数
#include<stdio.h>
int my_strlen(char *str)
{
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
void reverse_string(char* str)
{
int len = my_strlen(str);
char tmp = *str;
*str = *(str + len - 1);
*(str + len - 1) = '\0';
if (my_strlen(str + 1) > 1)
{
reverse_string(str + 1);
}
*(str + len - 1) = tmp;
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
第五题的非递归解法
// 小知识点
//strlen 是库函数
//sizeof 是操作符
//
//strlen 是字符串长度的,只针对字符串,关注\0的位置,\0之前出现多少个字符,字符串的长度就是多少
//sizeof 是计算数据占用内存空间的大小,单位是字节,不在乎内存中存放的是什么
#include<stdio.h>
#include<string.h>
void reverse_string(char* str)
{
int len = strlen(str);
char* left = str;
char* right = str + len - 1;
while (left < right)
{
char tmp = *left;
*left = *right;
*right = tmp;
left++;
right--;
}
}
int main()
{
char arr[] = "abcdef";
reverse_string(arr);
printf("%s\n", arr);
return 0;
}
6.递归和非递归分别实现strlen
//递归
#include<stdio.h>
int my_strlen(char* str)
{
if (*(str + 1) == '\0')
{
return 1;
}
else
return 1 + my_strlen(str + 1);
}
int main()
{
char str[] = "abcdefgh";
int ret = 0;
ret = my_strlen(str);
printf("%d", ret);
return 0;
}
//非递归
#include<stdio.h>
int my_strlen(char *str)
{
int count = 0;
while (*str != '\0')
{
str++;
count++;
}
return count;
}
int main()
{
char str[] = "abcdefgh";
int ret = 0;
ret = my_strlen(str);
printf("%d", ret);
return 0;
}
#include<stdio.h>
int main()
{
int num[10] = { 0 };
printf("%d", sizeof(num));
return 0;
}