如何在不新增参数的前提下实现正确的带步长阶乘类递归函数?
正确的递归实现方案
首先得明确这个函数的核心需求:计算**range(1, n, step)中所有元素的乘积**,也就是从1开始,每次递增step,直到小于n的所有整数相乘。
你的递归函数出错的原因是:迭代逻辑是从1往大的方向遍历,而你的递归是从n往小的方向取数,但取的数完全不在目标序列里(比如function2(6,3)取了6、3、1,但目标序列是1、4),自然结果不符。
下面是符合要求的递归实现,完全不新增任何参数:
def function2(n, step): # 终止条件:当n <= 1时,range(1, n, step)没有元素,空乘积结果为1 if n <= 1: return 1 # 找到小于n的最大的、属于目标序列的数(即1, 1+step, 1+2*step...中最后一个小于n的数) current = ((n - 2) // step) * step + 1 # 递归计算前面所有元素的乘积,再乘以当前数 return current * function2(current, step)
逻辑拆解
- 终止条件:当
n <= 1时,range(1, n, step)是空序列,空乘积的结果为1,这和迭代函数的初始值result=1完全对应。 - 定位当前乘数:通过
((n - 2) // step) * step + 1计算出目标序列中最后一个小于n的数。举两个例子:- 当
n=6,step=3时:(6-2)//3 = 1,1*3+1=4,正好是目标序列的最后一个数。 - 当
n=13,step=3时:(13-2)//3=3,3*3+1=10,对应序列的最后一个数。
- 当
- 递归递推:用当前数作为新的
n传入递归函数,这样递归就会计算出当前数之前所有序列元素的乘积,再乘以当前数就得到最终结果。
测试验证
用你提供的测试用例验证,结果完全匹配迭代函数的预期:
function2(6, 3)→ 4(对应1*4)function2(13, 3)→ 280(对应147*10)function2(11, 2)→ 945(对应13579)function2(5, 3)→4(对应1*4)
内容的提问来源于stack exchange,提问作者yierstem
相关产品推荐
相关产品推荐

