work5-递归

20 阅读2分钟

image.png

基础阶段

🫓1. 欧几里得减法:递归求最大公约数

  • 如果 d 能整除 a 且 d 能整除 b,那么 d 也能整除 a-b
  • 反之,如果 d 能整除 a-b 和 b,那么 d 也能整除 a

假设 a 和 b 的最大公约数是 d。

  • 想象有两根长度分别为 a 和 b 的棍子,它们都可以被长度为 d 的小棍整除(即a和b都是d的整数倍)。
#include<stdio.h>
int Gcd(int a,int b) {
	if (a > b) {
		return Gcd(a - b, b);
	}
	else if (a < b) {
		return Gcd(a, b - a);
	}
	else if (a == b) {
		return a;
	}
}
int main() {
	int m, n;
	scanf_s("%d,%d", &m, &n);
	printf("%d\n",Gcd(m,n));
	return 0;
}

2. 递归进制转换

#include<stdio.h>
void Eight(int a) {
	if (a / 8 != 0) {
		Eight(a / 8);
		printf("%d", a % 8);
	}
	else {
		printf("%d", a);
	}
}
int main() {
	int n;
	while (scanf_s("%d", &n) != EOF) {
		Eight(n);
		printf("\n");
	}
	return 0;
}

3. 吃糖果

#include<stdio.h>
int f(int a) {
	if (a>2) {
		return f(a - 1) + f(a - 2);
	}
	else if (a==2) {
		return 2;
	}
	else if (a == 1) {
		return 1;
	}
}
int main() {
	int n;
	while (scanf_s("%d", &n) != EOF) {
		printf("%d\n", f(n));
	}
	return 0;
}

🫓4.直线分平面

逻辑不太明白 暂时用枚举法

#include<stdio.h>
int f(int a) {
	if (a>1) {
		return f(a - 1) + a;
	}
	else if (a == 1) {
		return 2;
	}
}
int main() {
	int n;
	while (scanf_s("%d", &n) != EOF) {
		printf("%d\n", f(n));
	}
	return 0;
}

🫓5. 折线分平面

image.png

    if (a == 1) {
        return 2;
    }
    else {
        return f(a - 1) + 4 * a - 3;
        //n-1条折线相当于2n-2条射线
        //当引入第n条折线,先引入第一条射线, 会增加 2n-1个平面
        //再引入第二条射线,再会增加2n-2个平面(因为有一个分出来的平面和之前的连通,故去掉一个)
    }

6. 骨牌

#include<stdio.h>
int f(int a) {
	if (a>3) {
		return f(a - 1) + f(a - 2)+f(a-3);
	}
	else if (a==3) {
		return 4;
	}
	else if (a == 2) {
		return 2;
	}
	else if (a == 1) {
		return 1;
	}
}
int main() {
	int n;
    scanf_s("%d", &n);
    printf("%d\n", f(n));
	return 0;
}