[Haskell] CodeWars|Bouncing Balls

https://www.codewars.com/kata/5544c7a5cb454edb3c000047/haskell

题目

一个小孩在一个超高建筑的n楼打球,高度为 h(h>0) ,他把球丢出了建筑,垂直下落并弹起,每次弹起的高度是上一次的 bounce(0<bounce<1) 倍。他母亲从 window(window<h) 高度往窗外看。他母亲会看到多少次球呢?(看到球定义为球经过window的高度)
如果上述3个参数的条件都满足了,输出一个正整数表示他母亲会看到的球的次数,否则返回-1表示参数错误。

样例

h = 3, bounce = 0.66, window = 1.5, result is 3

h = 3, bounce = 1, window = 1.5, result is -1 (bounce >= 1).

题解

  1. 模拟法
module Codewars.Kata.BouncingBall where

bouncingBall :: Double -> Double -> Double -> Integer
bouncingBall' h bounce window
    | h < window = 0
    | h == window = 1
    | otherwise = 2 + bouncingBall' (h * bounce) bounce window

bouncingBall h bounce window
    | bounce >= 1 || bounce <= 0 || h <= 0 || window >= h = -1
    | otherwise = 1 + bouncingBall' (h * bounce) bounce window
  1. 数学法
    相当于求最大的n,使得
    h×(bounce)n>window

    n<logbouncewindowh

    那么有
    n=logbouncewindowh

    n表示弹跳的次数,显然母亲看到的次数就是 2n+1 了。
bouncingBall h b w
  | not (h > 0 && 0 < b && b < 1 && w < h) = -1
  | otherwise = floor (logBase b $ w / h) * 2 + 1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值