C语言函数递归经典练习解析(图文)(全排列问题,青蛙上台阶问题)

一.汉诺塔问题

c语言解决汉诺塔问题(常规与递推方式)

 在一根柱子上从下往上按照大小顺序摞着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;
}

新人博主,如有问题欢迎指正,感谢支持。  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值