汉诺塔问题
汉诺塔是什么,这个不多加说明可以看这个
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;
}
来源:https://blog.csdn.net/wuweiwuju___/article/details/89647156