不使用循环和递归如何统计c在a、b区间内的约数个数
问题描述
已知a、b、c三个数均不为0,需要找出c的所有取值在a到b区间(包含a、b两端)的约数,并统计符合条件的约数数量。原实现采用递归逻辑,但要求不能使用递归也不能使用循环,需要给出符合要求的实现。
原递归实现代码如下:
a,b,c=5,25,10 def divisors(a,b,c): def divs(a, b, c, l=[], d=1): if (c % d == 0) & (min(a, b) <= d <= max(a, b)): l.append(d) if d == c: return None divs(a, b, c, l, d + 1) return l if a!=0 and b!=0 and c!=0: return len(divs(a,b,c)) else: print("A,B,C Ar unda iyos 0") return False print(divisors(a,b,c))
实现方案
可以通过Python内置的filter函数完成筛选,全程不需要手动编写for/while循环,也不需要递归逻辑:
a,b,c = 5,25,10 def divisors(a,b,c): if a == 0 or b == 0 or c == 0: print("A,B,C Ar unda iyos 0") return False low = min(a,b) high = max(a,b) # 内置filter完成条件筛选,底层迭代由解释器封装,无手动循环/递归 valid_divisors = filter(lambda x: c % x == 0 and low <= x <= high, range(1, c+1)) return len(list(valid_divisors)) print(divisors(a,b,c))
逻辑说明
- 保留了原代码的参数非0校验逻辑,输出提示和返回值和原实现完全一致
- 先对a、b取最大最小值,适配a大于b的场景
range(1, c+1)生成1到c的所有整数,通过filter筛选同时满足「是c的约数」「落在目标区间」两个条件的数值,最后转换为列表取长度,就是符合要求的约数个数- 示例输入
a=5、b=25、c=10运行后输出为2,和原递归代码结果完全一致,对应符合条件的约数为5、10两个
内容的提问来源于stack exchange,提问作者Hel Muth
相关产品推荐
相关产品推荐

