> 文章列表 > 练习之烦人的递归

练习之烦人的递归

练习之烦人的递归

文章目录

  • 1.删除公共字符
  • 2.读入一串以'?'结束的字符串,逆序输出。
    • 法一:常规递归
    • 法二:投机取巧
  • 3.递归将整数输出为字符串
  • 4.递归输出1--n的平方和
  • 5.递归计算2+22+222+...
  • 6.递归求最大公约数
  • 7.递归输出x的n次方
  • 8. 递归计算下列式子的值

1.删除公共字符

输入两个字符串,从第一个字符串中删除第二个字符串中所有的字符。
保证两个字符串的长度均不超过100。

输入:两行字符串。
They are students.
aeiou
输出:删除后的字符串。
Thy r stdnts.

#include<stdio.h>
#include<string.h>
void dlt(char* s1, char* s2)
{char* x = s1;char* y = s2;int i, a[256] = { 0 }, n = strlen(s2);for (i = 0; i < n; ++i)a[s2[i]] = 1;while (*x){if (a[*x] == 0)*y++ = *x;x++;}*y = '\\0';
}
int main()
{char s1[1000], s2[1000];gets(s1);gets(s2);dlt(s1, s2);printf("%s\\n", s2);return 0;
}

2.读入一串以’?'结束的字符串,逆序输出。

法一:常规递归

#include <stdio.h>
#include <string.h>
char* reverse(char* s)
{if (!s)                    return NULL;                 int n = strlen(s);if (n > 1){char t = s[0];s[0] = s[n - 1];s[n - 1] = '\\0';        reverse(s + 1);            s[n - 1] = t;}return s;
}
int main()
{char str[100];gets(str);reverse(str);puts(str);return 0;
}

法二:投机取巧

#include <stdio.h>
void reverse()
{char c;scanf("%c", &c);if (c != '?'){reverse();printf("%c", c);}
}
int main()
{reverse();return 0;
}

3.递归将整数输出为字符串

void convert(int n, int m)
{int i;if ((i = n / 10) != 0)convert(i, m);putchar(n % 10 + '0');if (n != m) printf("-");
}int main() 
{int n;scanf("%d", &n);if (n < 0) {printf("-");n = - n;}convert(n, n);printf("\\n");return 0;
}

4.递归输出1–n的平方和

#include <stdio.h>
#include <math.h>int sum(int n)
{if (n == 1)return 1;return n * n + sum(n - 1);
}int main()
{int n;scanf("%d", &n);printf("%d", sum(n));return 0;
}

5.递归计算2+22+222+…

#include<stdio.h>
int f(int a, int n)
{if (n > 1)return a * n + f(a, n - 1) * 10;elsereturn a;
}
int main()
{int a, n;scanf("%d %d", &a, &n);printf("%d", f(a, n));return 0;
}

在这里插入图片描述

6.递归求最大公约数

#include<stdio.h>
int gcd(int a, int b)
{if (a <= 0 || b <= 0) return 0;    if (a % b == 0)return b;           else gcd(b, a % b);               
}
int main()
{int a, b, c;scanf("%d,%d", &b, &c);a = gcd(b, c);printf("%d和%d的最大公约数为:%d\\n", b, c, a);
}

7.递归输出x的n次方

#include<stdio.h>
double f(int x, int n)
{double s = 1;if (n > 0)s = x * f(x, n-1);else if (n == 0)s = 1;else s = 1.00 / f(x, -n);return s;}
int main()
{int x = 0, n = 0;scanf_s("%d %d", &x, &n);printf("%lf\\n", f(x, n));return 0;
}

8. 递归计算下列式子的值

在这里插入图片描述

#include<stdio.h>
#include<math.h>
double f(double x, int n)
{if (n == 1)return sqrt(1 + x);elsereturn sqrt(n + f(x, n - 1));
}
int main()
{double x;int n;scanf("%lf %d", &x, &n);printf("%lf", f(x, n));return 0;
}