【问题标题】:How do I bound a number between two constants using the modulus operator?如何使用模运算符在两个常量之间绑定一个数字?
【发布时间】:2014-04-17 13:14:23
【问题描述】:
def boundThis(x):
    min = 20
    max= 100
    boundX = int(x)
    if (boundX > max):
        boundX = boundX % max + min-1
        if (boundX > max):
          boundX-=max-1
    else:
        while(boundX < min):
            boundX += max-min
    return boundX

我试图将 x 绑定在两个数字之间,20 和 100(不包括)。也就是说,一旦达到 100,它应该循环回到 20。

我知道它是如何与 while 循环一起工作的(while boundX modulus 运算符并用它编写正确的表达式时遇到了问题。

例如。 boundThis(201) 应该给我 21,而 boundThis(100) 给我 20。

【问题讨论】:

标签: python algorithm


【解决方案1】:

请注意 minmax 已经是内置函数,因此不要使用这些标识符命名变量,因为您不能执行以下操作(假设您不尝试在其中生成数字列表指定的边界):

>>> def bound(low, high, value):
...     return max(low, min(high, value))
... 
>>> bound(20, 100, 1000)
100
>>> bound(20, 100, 10)
20
>>> bound(20, 100, 60)
60

编辑:

对于环绕条件,将其视为一个数学问题。如您所知,取模运算符本质上是在除数上找到除法运算的剩余部分,因此我们可以使用它。因此,如果您的偏移量为 0n,则基本情况非​​常简单。

>>> 99 % 100
99
>>> 101 % 100
1

但您希望它偏离某个基值 (low),因此您必须应用基础数学并将该问题简化为上述问题。我建议您在阅读下面的解决方案之前尝试自己解决这个问题。

>>> def bound(value, low=20, high=100):
...     diff = high - low
...     return (((value - low) % diff) + low)
...
>>> bound(0)
80
>>> bound(19)
99
>>> bound(20)
20
>>> bound(100)
20
>>> bound(99)
99

【讨论】:

  • 即使您尝试生成一个列表,它也可以正常工作,您只需使用像 list = [bound(20, 100, value) for value in numbers] 这样的列表理解
  • @WCGPR0 我的任一解决方案(针对您之前已澄清的问题)均不涉及任何递归...
猜你喜欢
  • 2020-09-20
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 2021-09-01
  • 1970-01-01
  • 2019-05-20
  • 1970-01-01
相关资源
最近更新 更多