一.汉诺塔问题
在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
二.全排列问题
输入一个数组,求出其所有排列的可能
1.分析问题
如何用递归的方式进行解决
通过上图我们就可以清晰直观的看到如何去递归
2.创建函数:
1).创建交换函数
这样才可以对每一次的锁定变换元素
2).创建全排列函数
这是实现递归的关键一步
3.代码实现
int count = 0;
void swap(char* str1, char* str2) {
char temp = *str1;
*str1 = *str2;
*str2 = temp;
}
void change(char* str3,int z,int y) {
if (z == y) {//当已经交换到最后一位时就开始打印
printf("%s\n", str3);
count++;
}
else {
for (int i = y; i >= z; i--) {
swap((str3 + i), (str3 + z));
change(str3, z+ 1, y);
swap((str3 + i), (str3 + z));//换回来
}
}
}
int main() {
char str[100];
printf("请输入字符:\n");
fgets(str, sizeof(str), stdin);
str[strcspn(str, "\n")]='\0';//作用是去除换行符
change(str,0,strlen(str)-1);
printf("一共有%d种情况", count);
return 0;
}
三.青蛙上台阶问题(斐波那契数列问题)
已知一只青蛙可以选择一次上一阶或两阶台阶,求上n个台阶的方法共有多少种
*其实问题可以改变为:
青蛙的最后一步是走两个台阶还是一个台阶
1).若最后一步为两个台阶,则需计算前面f(n-2)的情况
2).若最后一步为一个台阶,则需计算前面f(n-1)的情况
由上可知:
f(n)=f(n-1)+f(n-2) ps;这就是斐波那契数列的表达式
斐波那契额数列代码的实现:
1.
int fibo(int b) {
if (b <= 2) {
return 1;
}
else {
return fibo(b - 1) + fibo(b - 2);
}
}
int main() {
int b;
scanf("%d", &b);
printf("%d", fibo(b));
return 0;
}
因为fibo(b-1)+fibo(b-2)会进行大量且重复的计算,所以这种方式的效率较低
我们可以从逆着写,改为正着写以减少重复的计算
2.斐波那契数列(2)(迭代)*****(难想但效率高,更推荐)
通过设
执行一次程序之后a变为第二个数,b变为第三个数,c变为第四个数
int fibo(int n) {
int a = 1,b=1, c=1, d = 0;
if (n <= 2) {
return 1;
}
else {
for (d = 1; d <= n; d++) {
a = b;
b = c;
c = a + b;
}
return a;
}
}
int main() {
int a = 0;
scanf("%d", &a);
printf("青蛙有%d种跳法",fibo(a+1));//为什么是a+1,因为青蛙的跳法实际是从斐波那契数列第二项开始的
return 0;
}
新人博主,如有问题欢迎指正,感谢支持。