程序员成长之旅——函数与递归经典题目

程序员成长之旅——函数与递归经典题目

汉诺塔问题

汉诺塔是什么,这个不多加说明可以看这个
https://baike.baidu.com/item/%E6%B1%89%E8%AF%BA%E5%A1%94/3468295?fr=aladdin
那如何用递归思想实现汉诺塔问题呢?
假设看四层
在这里插入图片描述
把A中n-1层看成一个整体,将它经过一系列操作到B上,然后将A移动到C上,在将B中n-1层看成一个整体,经过一系列操作到C上。这样就完成了汉诺塔问题。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

int t = 0;
void hanoi(int n,char a,char b,char c)
{
	if (n == 1)
	{
		printf("%c->%c\n", a, c);
		t++;
	}
	else
	{
		h(n - 1, a, c, b);
		printf("%c->%c\n", a, c);
		t++;
		h(n - 1, b, a, c);
	}
}
int main()
{
	int x = 0;
	printf("输入汉诺塔的层数:>");
	scanf("%d", &x);
	hanoi(x, 'A', 'B', 'C');
	printf("移动了%d次\n", t);

}

青蛙跳台阶问题

普通跳台阶问题

青蛙跳台阶 一次可以跳一级 , 还可以跳两级,
问跳n阶的台阶有几种跳法
n = 1 时 1种
n = 2 时 2种
n = 3 时 3种
n = 4 时 5种
n = 5 时 8种
用数学归纳法很容易得出来满足斐波那契数列
f(n) = f(n-1) + f(n-2) n>=2
也可以这么理解
第一次跳一阶 还剩 n - 1 阶 则有f(n-1)种跳法
第一次跳两阶 还剩 n - 2 阶 则有f(n-2)种跳法
所以总的跳法f(n) = f(n-1) + f(n-2)

#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<stdlib.h>
int fib(int n)
{
	if (n == 1 || n == 2)
		return n;
	return fib(n - 1) + fib(n - 2);
}
int main()
{
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = fib(n);
	printf("%d \n", ret);
	system("pause");
	return 0;
}

变态跳台阶问题

青蛙跳台阶 一次可以跳一级 , 二级,… 还可以跳n级,问跳n阶的台阶有几种跳法
第一次跳一阶 还剩 n - 1 阶 则有f(n-1)种跳法
第一次跳两阶 还剩 n - 2 阶 则有f(n-2)种跳法
第一次跳三阶 还剩 n - 3 阶 则有f(n-3)种跳法

第一次跳n阶 还剩 n-n 阶 则有f(n-n)种跳法
所以总的跳法f(n) = f(n-1) + f(n-2) + f(n-3)…+f(n-n)
f(n-1) = f(n-2) + f(n-3)…+f(n-n)
所以f(n) = f(n-1)*2 n>=2
当只有一阶的话 就是只有一种跳法 设f(0) = 1

int jumpFloor(int n)
{
	if (n == 1 || n == 0)
		return n;
	return jumpFloor(n - 1) * 2;
}
int main()
{
	int n = 0;
	int ret = 0;
	scanf("%d", &n);
	ret = jumpFloor(n);
	printf("%d \n", ret);
	system("pause");
	return 0;
}
发布了76 篇原创文章 · 获赞 16 · 访问量 4447

猜你喜欢

转载自blog.csdn.net/wuweiwuju___/article/details/89647156
今日推荐