练习之烦人的递归

文章目录

  • 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
#include
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 
#include 
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 
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 
#include 

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
int f(int a, int n)
{
	if (n > 1)
		return a * n + f(a, n - 1) * 10;
	else
		return a;
}
int main()
{
	int a, n;
	scanf("%d %d", &a, &n);
	printf("%d", f(a, n));
	return 0;
}

练习之烦人的递归_第1张图片

6.递归求最大公约数

#include
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
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. 递归计算下列式子的值

练习之烦人的递归_第2张图片

#include
#include
double f(double x, int n)
{
	if (n == 1)
		return sqrt(1 + x);
	else
		return sqrt(n + f(x, n - 1));
}
int main()
{
	double x;
	int n;
	scanf("%lf %d", &x, &n);
	printf("%lf", f(x, n));
	return 0;
}

你可能感兴趣的:(C语言经典题目,c++,c语言,算法)