美文网首页
递归 上楼梯问题

递归 上楼梯问题

作者: iFavorite | 来源:发表于2017-10-10 16:06 被阅读40次

有一段楼梯台阶有15级台阶,以小明的脚力一步最多只能跨3级,请问小明登上这段楼梯有多少种不同的走法?

A. 2345

B. 3261

C. 5768

D. 6843

解法:

http://blog.csdn.net/tengxing007/article/details/54882372
https://www.nowcoder.com/questionTerminal/360069ca7225478380ffdcfb7e4b2a2b 


递归思想 与 递归方法

做递归题目遇到这个问题,以为是用递归思想解出来的,原来并不是。只是用递归方法实现计算,套用斐波那契数列公式。网上的很多解法,都是先列举前面几个结果,发现正好符合斐波那契数列规律,然后再套入递归调用,算出结果。

个人认为,这种思想并不好,需要先知道斐波那契数列,才能解这道题。

我以为,比较好的利用递归思想解题,如下汉诺塔的解题思路。

http://blog.csdn.net/computerme/article/details/18080511?locationNum=14&fps=1 

设f(n)为将n片圆盘所在塔全部移动到另一塔最少总次数;由递归算法可知:f(1) = 1;当n>1时,f(n)  = f(n-1) +1 + f(n-1)。f(n) = 把上面n-1片圆盘移动到中间塔最少总次数f(n-1) + 把第n片圆盘移动到目标塔+把中间盘的n-1片圆盘移动到目标塔最少总次数为f(n-1)。由数学计算可得:f(n)=2^n-1。(n>0)。


汉诺塔的解题过程,先得出递归公式,再穷举,进一步得出最终公式。-- 递归思想

上楼梯问题的解题过程,先穷举,得出公式,用递归实现。 -- 递归方法

我这里本来想自己用递归思想来解题,目前看来不现实,暂无解决方案。

结论:

1、斐波那契数列在生活中由哪些应用?

2、解算法问题时,尝试看看各个数据之间的关系,然后得出公式。


还有一个笨方法,把所有排列组合写出来,选择其中正好为总阶梯数目的组合,统计有多少种组合,就有多少种方法正好走完。以下是代码,当然还有很多可以改进的地方,感觉意义不大,就不继续深究了。

#include "stdafx.h"

#include "stdlib.h"

#include "time.h"

using namespace std;

//#define MAX_TIMES (1073741824)

#define ALL_STAIRS (12)

#define MAX_STEPS (3)

#define MIN_STEPS (1)

void print_time()

{

static time_t t1 = 0,t2 = 0;

struct tm * lt;

if (0 == t1)

{

time (&t1);//获取Unix时间戳。

return;

}

time (&t2);//获取Unix时间戳。

//lt = localtime (&t);//转为时间结构。

//printf ( "%d/%d/%d %d:%d:%d\n",lt->tm_year+1900, lt->tm_mon, lt->tm_mday, lt->tm_hour, lt->tm_min, lt->tm_sec);//输出结果

cout << "spend time = " << t2 - t1 << endl;

return;

}

void print_array(int *array, int size)

{

int i = 0;

while (i < size)

{

cout << array[i] << " , ";

i++;

}

cout << "\r\n" << endl;

return;

}

char calc(int * array, int size)

{

int ret = 0;

int sum = 0;

int i = 0;

int invalid_zero = 0;

while ((i < size))

{

if (0 == array[i])

{

invalid_zero = 1;

break;

}

sum += array[i];

i++;

}

while ((i < size))

{

if ((1 == invalid_zero) && (0 != array[i]))

{

return 0;

}

i++;

}

if (ALL_STAIRS == sum)

{

ret = 1;

}

return ret;

}

int add(int * value)

{

int ret = 0;

if (*value == MAX_STEPS)

{

*value = MIN_STEPS;//最少走一步

ret = 1;

}

else

{

(*value)++;

}

return ret;

}

int fullfill(int *array)

{

int i = 0;

int ret = 0;

while ((i < ALL_STAIRS) && add(&array[i]))

{

i++;

}

if (i >= ALL_STAIRS)

{

ret = 1;

}

return ret;

}

int selective_fill(int *array, int min_size, int max_size)

{

int i = 0;

int ret = 0;

while ((i < ALL_STAIRS) && add(&array[i]))

{

i++;

}

if (i >= ALL_STAIRS)

{

ret = 1;

}

return ret;

}

int _tmain(int argc, _TCHAR* argv[])

{

int array[ALL_STAIRS] = {0};

int array_size = sizeof(array)/sizeof(int);

int sum = 0;

int i = 0;

int max_times = ALL_STAIRS;

int min_times = ALL_STAIRS/MAX_STEPS + 1;

int max_calc_times = pow(double(MAX_STEPS+1),double(ALL_STAIRS));

cout << "max_calc_times = " << max_calc_times << endl;

print_time();//计时

while (1)

{

if (fullfill(array))

{

break;

}

//if (selective_fill(array, min_times, max_times))

//{

// break;

//}

print_array(array, array_size);

sum += calc(array, array_size);

//最慢的方法,一步一步走,就可以结束了

if (array[max_times-1])

{

break;

}

}

cout << "STEPS = " << MIN_STEPS << " ~ "<< MAX_STEPS << endl;

cout << "ALL_STAIRS = " << ALL_STAIRS << endl;

cout << "sum = " << sum << endl;

print_time();//计时

system("pause");

return 0;

}

相关文章

  • 递归 上楼梯问题

    有一段楼梯台阶有15级台阶,以小明的脚力一步最多只能跨3级,请问小明登上这段楼梯有多少种不同的走法? A. 234...

  • 小白上楼梯简易递归问题

    题目: 小白正在上楼梯,楼梯共n阶 小白可以一次上1阶,2阶或3阶 计算小白有多少种走完楼梯的方式 样例输入: 3...

  • 笔记03:爬楼梯递归问题

    假设楼梯有N阶,一次只能爬一阶或两阶,问有几种爬楼梯的方法? N=1, 1种N=2, 2种N=3, 3种N=4, ...

  • js递归

    递归的理解 1.在函数内部调用自身 2.明确递归结束的条件一.阶乘 二:求和 三.斐波那契数列 四.上楼梯问题 ...

  • 05 走楼梯(递归)

    题目大意是有n阶楼梯,可以一次走两级,也可以一次走n级。问走到第n阶一共有多少走法。 分析: 这种递归题目一般都是...

  • 递归--爬楼梯

    假设你正在爬楼梯。需要 n 阶你才能到达楼顶。每次你可以爬 1 或 2 个台阶。你有多少种不同的方法可以爬到楼顶呢...

  • DP 递归 递归 + 缓存

    最近发现DP的本质就是递归 + 缓存占坑 后续补经典的例子 爬楼梯 最小编辑距离 ... naive 递归 递归 ...

  • 算法:爬楼梯问题中的递归

    背景 最近在刷 leetCode 的时候发现一个问题,解决的思路其实完全可以用递归去实现,用递归的话代码又简洁,三...

  • 动态规划类

    1.定义问题2.找递归式3.初始化 一、 爬楼梯 描述假设你正在爬楼梯。需要 n 步你才能到达楼顶。每次你可以爬 ...

  • 2020-04-22

    针对39题,想起来,爬楼梯问题,分硬币问题。想到了用 dfs 递归来解决。1、针对不允许重复,想到了单调栈,这里也...

网友评论

      本文标题:递归 上楼梯问题

      本文链接:https://www.haomeiwen.com/subject/cvovyxtx.html