我尝试使用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]
答案 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
,例如4
,6
,8
或12
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)