【问题标题】:How to find the first odd digit in an integer recursively如何递归地找到整数中的第一个奇数
【发布时间】:2021-03-25 05:41:03
【问题描述】:

我是 python 新手,我正在尝试更适应递归。我试图递归地找到整数的第一个奇数。如果没有找到奇数,则返回 -1。每当我运行这段代码时,我总是得到 35 而不是 5。

这是我尝试过的

def first_odd(n):
  if n == 0:
    return 0
  elif n % 2 == 1:
    return first_odd(n//10) * 10 + n%10
  else:
    return first_odd(n//10)
print(first_odd(2345))

【问题讨论】:

  • 我没有看到问题。
  • 原来是标题,如何递归求整数的第一个奇数
  • 是的,但您并未声明您在问题中发布的代码有任何问题。除非另有说明,否则我会假设它工作得很好。
  • Ahh 它只返回所有奇数而不是整数中的第一个奇数。抱歉,我刚开始在 Stack Overflow 上提问
  • 好用吗???

标签: python-3.x recursion


【解决方案1】:

如果我正确理解了您最近对 Tarik 的评论,听起来您想要一个返回第一个奇数的函数从右到左扫描整数,如果没有找到奇数,则返回 - 1.例如,在您的原始帖子中,您说整数 2345 您期望 3 的值,但根据您的评论,听起来 5 将是从右到左扫描的正确答案,对吧?如果是这样,那么下面的代码应该符合该描述。

from random import randint

def find_rightmost_odd_digit(number):
    while number:
        rightmost_digit = number % 10
        if rightmost_digit % 2:
            return rightmost_digit
        number = number // 10
    return -1

for _ in range(10):
    number = randint(0, 1000)
    print(f"{number:>10}{find_rightmost_odd_digit(number):>4}")

输出:

       387   7
        88  -1
       639   9
       196   9
       986   9
       232   3
        82  -1
       907   7
       948   9
       214   1

【讨论】:

  • 大声笑,我们一直在免费解决这个作业 :-) +1 为你的努力。
【解决方案2】:

您基本上是在正确的轨道上,但只是包含了一个您不需要的额外递归。考虑:

def first_odd(n):
    if n == 0:
        return -1

    if n % 2 == 1:  # number is odd, return last digit
        return n % 10

    return first_odd(n // 10)

如果这按预期工作,那么我可以按如下方式实现它以组合几个部门:

def first_odd(n):
    if n == 0:
        return -1

    quotient, remainder = divmod(n, 10)

    if remainder % 2 == 1:  # remainder is odd, return it
        return remainder

    return first_odd(quotient)

还有没有办法从左到右找到第一个奇数 使用 1 个参数?

from math import log10

def first_left_odd(n):
    if n == 0:
        return -1

    power = 10 ** int(log10(n))

    digit = n // power

    if digit % 2 == 1:
        return digit

    return first_left_odd(n - digit * power)

或者如果使用数学库和/或log10() 是个问题,那么:

def first_left_odd(n):
    if n < 10:
        return n if n % 2 == 1 else -1

    result = first_left_odd(n // 10)

    if result != -1:
        return result

    return first_left_odd(n % 10)

【讨论】:

  • 非常感谢! :) 还有一种方法可以使用 1 参数从左到右找到第一个奇数吗? Tarik 已经回答了,但如果可能的话,我想使用 1 个参数。
  • @Squishy,我使用数学库中的log10 添加了一个参数从左到右的解决方案。
【解决方案3】:

构建复杂的程序是组合几个简单程序的问题。对于这个问题,我会编写一个程序,将数字分解为digits,并检查是否有任何特定数字is_odd -

def first_odd(n):
  for d in digits(n):
    if is_odd(d):
      return d
  return None

我们可以轻松编写digitsis_odd -

def is_odd(n):
  return n & 1

def digits(n):
  if n < 0:
    yield from digits(n * -1)
  elif n < 10:
    yield n
  else:
    yield from digits(n // 10)
    yield n % 10
print(first_odd(2345))     # 3
print(first_odd(6804721))  # 7
print(first_odd(2468))     # 9
print(first_odd(-465321))  # 5

【讨论】:

    【解决方案4】:

    这可能会做到:

    def first_odd(n, digit):
        if n == 0:
            return None
        elif n % 2 == 1:
            return digit
        else:
            return first_odd(n//10, digit+1)
    
    
    first_odd(2345, 0)
    

    如果您希望第一个数字为 1,请传递 1 而不是 0

    好的,这是从左到右的:

      def first_odd(n, digit):
        if n == 0:
            return None
    
        pos = first_odd(n//10, digit+1)
        if pos is None and n % 2 == 1:
            return digit
        else:
            return pos
    
        
    

    【讨论】:

    • 大声笑,好的,会测试。
    • 真的吗?用 1230236 测试一下。
    • 是的,它适用于此,但我也在努力使其适用于所有数字。我的意思是从右到左的整数中找到的第一个奇数。对不起,如果我的问题措辞有点混乱
    • 还有从左到右的方法吗?只是问
    • 我将其添加到我的答案中,但尚未对其进行测试。试试看,如果它不起作用,请告诉我
    猜你喜欢
    • 2020-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-04
    • 1970-01-01
    • 1970-01-01
    • 2021-02-17
    • 2013-02-12
    相关资源
    最近更新 更多