一个好玩的题,asp.net可作为面试题的递归算法

今天刷圈子看到一个这样的题,挺有意思的

烧了半天脑,给计算出来了。分享给同事看看是不是能拿代码计算出来,同事在那辛辛苦苦的算了半天;说找到了规律,但是,然并卵,他给的规律是:10/5+10/5-1+10/5-1-1....;当付款为10圆的时候的确,结果就是15;但是多了以后,就错乱了;

我首先想到的是递归,所以先试了一试;

首先定义常量,  瓶数、当前剩余瓶子、当前剩余盖子、找零等;

然后就是计算了;首先计算钱能买多少瓶;

然后判断一下,空瓶是否能换,如果能,执行换瓶;

执行换瓶;

判断换完后瓶子的数量是否还能换,能换就继续换,不能就换瓶盖;

换瓶盖的方法跟换瓶子的方法几乎一样,只不过参数变成换盖子的了;

写完测试一下。的确可以计算;

但是这个递归好像不怎么完美,有点像是硬解出来的,好在能计算出结果,所以重新整理了一下思路,把两个递归写进一套程式,然后代码就比较容易理清了。

同样,第一步;先计算花的钱能买多少瓶,能剩多少钱:

其实这一步不用单独写方法的,但是习惯了,总想把独立的东西拿出去写,就先给封装上吧;

然后就可以把计算出的总瓶数加入到递归中了;

递归第一步。把数量分别累加到总瓶数、当前瓶数、当前瓶盖数中;

第二步:检查手中瓶子数量是否够换购啤酒,可以换就换(计算出可换数量后进行递归):

第三步:检查手中瓶盖数量是否够换购啤酒,可以换就换(计算出可换数量后进行递归):

这样总体就完成了!

 static void By(int monny)
        {
            int flg = monny / 2;
            outmonny = monny % 2;
            foo(flg);
        }

        private static void foo(int num)
        {
            Count+= num;
            ping += num;
            gai += num;
            if (ping / 4 >=1)
            {
                int flg = ping / 4;
                ping = ping % 4;
                foo(flg);
            }
            if (gai / 2 >= 1)
            {
                int flg = gai / 2;
                gai = gai % 2;
                foo(flg);
            }
        }

结果比较有意思。

是有一定规律的:


挺好玩的一种算法,闲着没事可以陶冶情操


  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值