python意外的结果

时间:2018-03-21 13:10:10

标签: python output runtime-error

我尝试使用Python打印一个数字因子。即如果输入值为<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script> <div class="contact-form"> <div class="contact-form__row"> <p>Text field</p> <input type="text" /> </div> <div class="contact-form__row"> <p>Radio fields</p> <label for="radio-1">Radio 1</label> <input id="radio-1" type="radio" name="radio-option" /> <label for="radio-2">Radio 2</label> <input id="radio-2" type="radio" name="radio-option" /> </div> <div class="contact-form__row"> <p>Checkbox fields</p> <label for="checkbox-1">Checkbox 1</label> <input id="checkbox-1" type="checkbox" /> <label for="checkbox-2">Checkbox 2</label> <input id="checkbox-2" type="checkbox" /> </div> <div class="contact-form__row"> <p>Select options</p> <select id="my-select" name="my-select"> <option value="a">Option A</option> <option value="b">Option B</option> </select> <select id="my-select" name="my-select"> <option></option> <option value="a">Option A</option> <option value="b">Option B</option> </select> </div> <div class="contact-form__row"> <p>Text area</p> <textarea></textarea> </div> <div class="contact-form__row"> <input type="submit" value="Submit" disabled /> </div> </div>,则输出为24(1 * 2 * 2 * 2 * 3 = 24)。

但以下程序的答案是[1,2,2,2,3],而不是[1,2,3,2,2,2,2]

[1,2,3,2,2]

1 个答案:

答案 0 :(得分:2)

问题是递归调用:

while(i<=a):
    if(a%i==0):
        if(is_prime(i)):
            li.append(i)
            a=int(a/i)
            if(a==1):
                return 
        else:
            fact(a)  # <-- problem
    i=i+1

这将再次针对fact的任何非素因素调用a,例如46812 24的情况。这些调用将再次将2添加到(全局)结果列表中。相反,删除递归调用,然后继续循环。此外,您应该将最外面的if更改为while,以便找到相同因素的多个。

此外,对is_prime的调用是多余的,因为i已经保证为素数(否则a将被i&#中的一个除以39; s的主要因素),return也是多余的。最后,为了让这个函数不仅适用一次,我强烈建议在函数内移动li 的声明并在结尾处返回。

def fact(a):
    li = [1]  # actually, 1 is not a prime factor, though
    i = 2
    while i <= a:
        while a % i == 0:
            li.append(i)
            a = a // i
        i += 1
    return li

li = fact(a)