递归专项练习

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

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Strlen(const char* str)
{
 if (*str == '\0')
 {
  return 0;
 }
 return 1 + Strlen(str + 1);
}
char* Reverse_string(char* str)
{
 if (*str == '\0')
 {
  return 0;
 }
 char temp = 0; 
 int len = Strlen(str);
 temp = *str;//首字符暂存起来,
 *str = *(str + len - 1);//最后一个字符放在首元素的位置
 *(str + len - 1) = '\0';//后面位置用\0补充
 if (Strlen(str + 1) > 1)//进行递归
 {
  Reverse_string(str + 1);
 }
 *(str + len - 1) = temp;//将首位置的元素放在后面的位置,
 return str;
}
int main()
{
 char str[1024] = " ";
 printf("输入需要反转的字符串:");
 scanf("%s", &str);
 printf("%s\n",Reverse_string(str));
 system("pause");
 return 0;
}

2,实现n的k次方:

(1)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Function(int n, int k)
{
 int num = 1;
 for (int i = 1; i <= k; ++i)
 {
  num *= n ;
 }
 return num;
}
int main()
{
 int n = 0;
 int k = 0;
 printf("请输入n和k的值:");
 scanf("%d %d", &n, &k);
 int ret = Function(n, k);
 printf("%d\n", ret);
 system("pause");
 return 0;
}

(2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Function(int n, int k)//前提是n和k均为非负整数
{
 if (k == 1)
 {
  return n;
 }
 return n*Function(n, k - 1);
}
int main()
{
 int n = 0;
 int k = 0;
 printf("请输入n和k的值:(n和k为非负整数)");
 scanf("%d %d", &n, &k);
 int ret = Function(n, k);
 printf("%d\n", ret);
 system("pause");
 return 0;
}

3,写一个递归函数DigitSum(n),输入一个人非负整数,返回组成它的每位数字之和:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int DigitSum(int n)
{
 if (n > 0)
 {
  return n % 10 + DigitSum(n / 10);
 }
 return 0;
}
int main()
{
 int n = 0;
 scanf("%d", &n);
 int ret = DigitSum(n);
 printf("%d\n", ret);
 system("pause");
 return 0;
}

4,递归和非递归实现strlen
(1)

#include<stdio.h>
#include<stdlib.h>
int Strlen(char* str)
{
 if (*str == '\0')
 {
  return 0;
 }
 return 1 + Strlen(str + 1);
}
int main()
{
 char str[] = "asdfgh";
 printf("%d\n",Strlen(str));
 system("pause");
 return 0;
}

(2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int strlen(const char* str)
{
 if (*str == '\0')
 {
  return 0;
 }
 int count = 0;
 while (*str != '\0')
 {
  ++str;
  ++count;
 }
 return count;
}
int main()
{
 char str[1024] = " ";
 printf("请输入要求长度的字符串:");
 scanf("%s", str);
 printf("%d\n", strlen(str));
 system("pause");
 return 0;
}

5,递归和非递归求N的阶乘

(1)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Factor(int n)
{
 if (n == 1)
 {
  return 1;
 }
 int num = 1;
 for (int i = 2; i <= n; ++i)
 {
  num *= i;
 }
 return num;
}
int main()
{
 int n = 0;
 int num = 0;
 printf("请输入要求阶乘的数:");
 scanf("%d", &n);
 num = Factor(n);
 printf("%d\n", num);
 system("pause");
 return 0;
}

(2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Factor(int n)
{
 if (n == 1)
 {
  return 1;
 }
 if (n > 1)
 {
  return n * Factor(n - 1);
 }
 return 0;
}
int main()
{
 int n = 0;
 printf("请输入要求阶乘的数:");
 scanf("%d", &n);
 int num = 0;
 num = Factor(n);
 printf("%d\n", num);
 system("pause");
 return 0;
}

6,递归和非递归实现第n个斐波那契数:
(1)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Fib(int n)
{
 if (n == 1 || n == 2)
 {
  return 1;
 }
 int num = 0;
 int num1 = 1;
 int num2 = 1;
 for (int i = 3; i <= n; ++i)
 {
  num = num1 + num2;
  num1 = num2;
  num2 = num;
 }
 return num;
}
int main()
{
 int n = 0;
 int num = 0;
 printf("请输入要求的项数:");
 scanf("%d", &n);
 num = Fib(n);
 printf("%d\n", num);
 system("pause");
 return 0;
}

(2)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
int Fib(int n)
{
 if (n == 1 || n == 2)
 {
  return 1;
 }
 if (n > 2)
 {
  return Fib(n - 1) + Fib(n - 2);
 }
 return 0;
}
int main()
{
 int n = 0;
 int num = 0;
 printf("请输入要求的项数:");
 scanf("%d", &n);
 num = Fib(n);
 printf("%d\n", num);
 system("pause");
 return 0;
}

7,打印一个多位数的每一位(从高往低)

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
void Print(int num)
{
 if (num > 9)
 {
  Print(num / 10);
 }
 printf("%d\t", num % 10);
}
int main()
{
 int n = 0;
 printf("请输入一个非负多位数:");
 scanf("%d", &n);
 Print(n);
 system("pause");
 return 0;
}

猜你喜欢

转载自blog.csdn.net/weixin_43870213/article/details/86615909