耿直的递归题

题目一:有这么一个表格,开始的位置在最左下角,一次只能向右或者向上跳一步,问从左下角到右上角一共有多少种走法?

不妨先从第一步开始分析,根据题意 每一步只能往上或者往下,那往上走一步试试。

会发现现在只有红色区域可以行动了,只看红色区域会发现,又是一样的问题,只是行数少了一个。同理,向右只是列数少了一个。

如果把一个八行五列的表格总共的步数表示为 f(8,5),那么显然  f(8,5)=f(7,5)+f(8,4)

同时最后一定是f(1,1)=0

那么写出递归解法

1 def find_n_steps(row, col):
2     if row == 1 and col == row:
3         return 0
4     result = 0
5     if row > 1:
6         result += 1 + find_n_steps(row - 1, col)
7     if col > 1:
8         result += 1 + find_n_steps(row, col - 1)
9     return result

然而里面有存在重复的计算, 比如f(7,5)和f(8,4)都会算一个f(7,4)

题目二: 青蛙跳台阶,一次只能跳一次或两次,问上n层有多少种跳法?

由第一题一样的思路,得出 f(n)=f(n-1)+f(n-2) 。同时会发现这是一个斐波那契数列。

def find_n_steps(n):
    if n < 1:
        return Exception("Invalid input")
    return __find_n_steps(n)

def __find_n_steps(n):
    if n == 1:
        return 1
    if n == 2:
        return 1

    return find_n_steps(n - 1) + find_n_steps(n - 2)

但是呢, 像第一题一样,里面会出现很多重复计算   比如f(n-1)里面又包括了f(n-2)的结果,所以可以换种循环的方式

def fibonacci(n):
    if n < 1:
        return Exception("Invalid input")
    if n == 1:
        return 1
    if n == 2:
        return 1
    count = 2
    sub1 = 1
    sub2 = 1
    current = -1
    while count < n:
        current = sub1 + sub2
        sub2 = sub1
        sub1 = current
        count += 1
    return current

  

时间: 2024-08-05 07:08:48

耿直的递归题的相关文章

递归题

公园里面有200个桃子,每天吃掉一半,扔掉一个烂的,第6天剩余多少桃子 (迭代法) 当天的数量=(上一天的数量/2)-1 var sl = 200; for(var i=0;i<6;i++){ sl = parseInt(sl/2)-1; } alert(sl); 公园里有一堆桃子,猴子每天能吃掉一半,扔掉一个烂的,发现第6天的时候剩余1个桃子,问刚开始有多少桃子 当天的剩余量= (下一天的剩余量+1)*2 迭代: var sl=1; for (var i=0;i<6;i++){ sl=(sl

为什么你学不会递归?刷题几个月,告别递归,谈谈我的经验

可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用,有时候还容易被递归给搞晕.也有好几个人来问我有没有快速掌握递归的捷径啊.说实话,哪来那么多捷径啊,不过,我还是想写一篇文章,谈谈我的一些经验,或许,能够给你带来一些帮助. 为了兼顾初学者,我会从最简单的题讲起! 递归的三大要素 第一要素:明确你这个函数想要干什么 对于

【日常学习】【搜索/递归】codevs2802 二的幂次方题解

转载请注明出处 [ametake版权全部]http://blog.csdn.net/ametake欢迎来看 题目描写叙述 Description 不论什么一个正整数都能够用2的幂次方表示. 比如:137=2^7+2^3+2^0 同一时候约定次方用括号来表示,即a^b可表示为a(b) 由此可知,137可表示为:2(7)+2(3)+2(0) 进一步:7=2^2+2+2^0 (2^1用2表示) 3=2+2^0 所以最后137可表示为:2(2(2)+2+2(0))+2(2+2(0))+2(0) 又如:1

- &gt; code vs 3038 3n+1问题(递归)

3038 3n+1问题 时间限制: 1 s 空间限制: 32000 KB 题目等级 : 白银 Silver 题解 题目描述 Description 3n+1问题是一个简单有趣而又没有解决的数学问题.这个问题是由L. Collatz在1937年提出的.克拉兹问题(Collatz problem)也被叫做hailstone问题.3n+1问题.Hasse算法问题.Kakutani算法问题.Thwaites猜想或者Ulam问题. 问题如下: (1)输入一个正整数n: (2)如果n=1则结束: (3)如果

杭电acm 2013题

蟠桃记 喜欢西游记的同学肯定都知道悟空偷吃蟠桃的故事,你们一定都觉得这猴子太闹腾了,其实你们是有所不知:悟空是在研究一个数学问题! 什么问题?他研究的问题是蟠桃一共有多少个! 不过,到最后,他还是没能解决这个难题,呵呵^-^ 当时的情况是这样的: 第一天悟空吃掉桃子总数一半多一个,第二天又将剩下的桃子吃掉一半多一个,以后每天吃掉前一天剩下的一半多一个,到第n天准备吃的时候只剩下一个桃子.聪明的你,请帮悟空算一下,他第一天开始吃的时候桃子一共有多少个呢? 这道题目几个月以前用循环做过,最近想重温下

做题感悟:放苹果

其实,这道题在一开始我就想到了正确解法的一部分,但是因为某闫同学而否定了自己(毕竟只想到了一部分). 好的我们先来看一下这道题: 放苹果 总时间限制:  1000ms 内存限制:  65536kB 描述 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分法?(用K表示)5,1,1和1,5,1 是同一种分法. 输入 第一行是测试数据的数目t(0 <= t <= 20).以下每行均包含二个整数M和N,以空格分开.1<=M,N<=10. 输出 对输入的每组数

做题感悟:爬楼梯

可能看到标题大家会很惊讶,毕竟这道题实在是太简单了,但是,我要讲的并不是这道题. 爬楼梯 总时间限制: 1000ms 内存限制:  65536kB 描述 树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数例如:楼梯一共有3级,他可以每次都走一级,或者第一次走一级,第二次走两级也可以第一次走两级,第二次走一级,一共3种方法. 输入 输入包含若干行,每行包含一个正整数N,代表楼梯级数,1 <= N <= 30 输出 不同的走法数,每一行输入对应一行输出 样例输入 5 8 10

一堆递推题

目录 一堆递推题 P1367[训练题]爬楼梯[2] 描述 輸入 輸出 輸入範例 1 輸出範例 1 提示 思路 铺瓷砖 描述 輸入 輸出 輸入範例 1 輸出範例 1 思路 城市路径 描述 輸入 輸出 輸入範例 1 輸出範例 1 提示 思路 彩带 描述 輸入 輸出 輸入範例 1 輸出範例 1 提示 思路 斐波那契前N项和 描述 輸入 輸出 輸入範例 1 輸出範例 1 提示 思路 偶数个3 描述 輸入 輸出 輸入範例 1 輸出範例 1 思路 回文拆分 描述 輸入 輸出 輸入範例 1 輸出範例 1 思路

为什么你学不会递归?告别递归,谈谈我的一些经验

可能很多人在大一的时候,就已经接触了递归了,不过,我敢保证很多人初学者刚开始接触递归的时候,是一脸懵逼的,我当初也是,给我的感觉就是,递归太神奇了! 可能也有一大部分人知道递归,也能看的懂递归,但在实际做题过程中,却不知道怎么使用,有时候还容易被递归给搞晕.也有好几个人来问我有没有快速掌握递归的捷径啊.说实话,哪来那么多捷径啊,不过,我还是想写一篇文章,谈谈我的一些经验,或许,能够给你带来一些帮助. 为了兼顾初学者,我会从最简单的题讲起! 递归的三大要素 第一要素:明确你这个函数想要干什么 对于