猴子摘香蕉一次可以摘1个或2个,总共50个,问有多少种摘法?

问题来自知乎

等我写完发现,知乎上都比我写的好,我快哭了!!!

等我写完之后发现不就是那啥啥函数,贴上lua代码

N很大的时候,估计是抗不住了,代码还需要优化。

function banana( n )
    local c = 1;
    if n == 0 then
        return 0
    elseif n == 1 then
        return 1
    elseif n == 2 then
        return 2
    end
    return (banana(n - 1) + banana(n - 2)) * c;
end

for i = 1,  10 do
    print(banana(i))
end

优化后的代码:

local know = {}

function banana( n )
    if know[n] then
        return know[n]
    end
    local c = 1;
    if n == 0 then
        know[n] = 0
        return 0
    elseif n == 1 then
        know[n] = 1
        return 1
    elseif n == 2 then
        know[n] = 2
        return 2
    end
    local r = (banana(n - 1) + banana(n - 2)) * c;
    know[n] = r
    return r
end

for i = 1,  50 do
    print(i, banana(i))
end
时间: 2024-08-15 12:07:58

猴子摘香蕉一次可以摘1个或2个,总共50个,问有多少种摘法?的相关文章

硬币找零&&爬楼梯&&猴子摘香蕉

硬币找零&&爬楼梯&&猴子摘香蕉 假设有几种硬币,如1.3.5,并且数量无限.请找出能够组成某个数目的找零所使用最少的硬币数. #include"CoinProblem.h" #include<iostream> int countNum=MAX; void CoinProblem(int *coin,int Length,int Value,int count){ if(Value==0){ if(countNum>count){ c

两个关于数列的Python脚本(斐波那契数列和猴子吃香蕉类问题)

斐波那契数列(Fibonacci sequence),因数学家列昂纳多·斐波那契(Leonardoda Fibonacci)以兔子繁殖为例子而引入,故又称为"兔子数列",又因其相邻两项的比无限接近黄金分割比例,所以又称为黄金分割数列,指的是这样一个数列:1.1.2.3.5.8.13.21.34.--,即后一项是前两项的和. #!/usr/bin/python #coding:utf-8 #斐波那契数列 x=[0,1] for i in range(int(raw_input('请输入数

算法-猴子搬香蕉

算法-猴子搬香蕉 2018年01月28日 19:59:15 阅读数:220 问题描述: 一个小猴子边上有100根香蕉,它要走过50米才能到家,每次它最多搬50根香蕉.它每走1米就要吃掉一根,请问它最多能把多少根香蕉搬到家里呢? 提示:他可以把香蕉放下往返的走,但是必须保证它每走一米都能有香蕉吃.也可以走到n米时,放下一些香蕉,拿着n根香蕉走回去重新搬50根. 程序实现: 接口: public interface MonkeysMoveBananas {     /**   *   * @para

逻辑题——飞机加油、硬币平分、猴子摘香蕉

1. 每个飞机只有一个油箱, 飞机之间可以相互加油(注意是相互,没有加油机) 一箱油可供一架飞机绕地球飞半圈.为使至少一架飞机绕地球一圈回到起飞时的飞机场,至少需要出动几架飞机?(所有飞机从同一机场起飞,而且必须安全返回机场,不允许中途降落,中间没有飞机场) 步骤如下: (1)3 架飞机同时从机场出发,飞行八分之一周(A点),各耗油四分之一.此时某架飞机给其余两架补满油,自己返回基地: (2)另一架飞机和目标机结伴,飞至四分之一周(B点),给目标机补满油,自己返回: (3)目标机独自飞行半周(C

一个顽猴沿着一座小山的n级台阶向上跳,猴子上山一步可跳1级或3级,试求上山的n级台阶有多少种不同的爬法。

#include<stdio.h> void main(){ int k,n; long f[1000]; printf("请输入台阶总数:"); scanf("%d",&n); f[1]=1;f[2]=1;f[3]=2; for(k=4;k<=n;k++){ f[k]=f[k-1]+f[k-3]; } printf("s=%ld\n",f[n]); } 这一问题实际是一个整数有序可重复拆分问题

一道腾讯校招试题

题目: 猴子摘香蕉一次可以摘1个或2个,总共50个,有多少种摘法? 分析: 得到如下规律 实际上是一个斐波那契数列 以下为我使用的4种解法,分别是递归.迭代.64位整型数. 数组(类似于大数相加). 代码1: 递归 //其中加入了计时器 #include <iostream> #include <ctime> using namespace std; int f(int n) { if(n<=0) return 0; else if(1==n || 2==n) return 

Python 趣味百题

趣味整数 1 不重复的3位数 -易 2 水仙花数 -易 3 完全数 -中 4 相亲数 -中 5 黑洞数 -中 6 勾股数 -易 7 自守数 -易 8 3位反序数 -中 趣味素数 1 素数 -中 2 孪生素数 -中 3 金蝉素数 -中 4 可逆素数 -中 5 回文素数 -中 6 平方回文素数 -中 7 梅森尼数 -中 8 哥德巴赫猜想 -中 9 等差素数数列 -中 趣味图形 1 回型矩阵 -中 2 九九乘法表 -易 3 杨辉三角 -易 数学问题 1 天平秤物 -难 2 黑色星期五 -易 3 存钱问

腾讯、网易有道和阿里的笔试分享及自我总结

声明:本人Android移动开发岗 腾讯:考的很杂 选择题(25题不定项):考的包括: 编译原理两题, 计算机网络一两题(私网地址), C++若干, IOS开发一两题, 还有二叉树两三题,先后序遍历,求深度 jvm也有一题, 概率论一两题, JavaScript一题, 还有C语言(包括指针数组,数组指针,指针函数之类的)也挺多的 更多的是看程序求输出. 大题: 1,10亿QQ号用Set和Vector两个容器来删除奇数号 2,猴子摘香蕉,一次可以摘一根或两根,求摘50根有几种摘法(斐波那契数列)

腾讯应用开发-20150409

腾讯笔试-应用开发-20150329 25道不定项选择题,4道简答题 选择题考察知识点: sizeof 一.1亿个不同的QQ号存在2个容器,set和vector,写出删除奇数号码的函数 二.猴子摘香蕉,一次只能摘1个或者2个,问摘50个香蕉有多少种摘法.(fibonacci数列) 三.程序填空题:二分查找.(mid的赋值,递归函数的参数) 四.free的内存是否还给OS,如果不是根据具体情况分析 腾讯 - 应用开发一面 2015-04-08 地点:天河区喜来登酒店.面试官是互动娱乐部门,说PHP