我对编程有点新意,我试图创建一个根近似代码。也就是说,我在微积分中做了类似于牛顿方法的事情。这个想法是,我要输入一个很大的值,减去直到我知道我已经通过根,然后添加一个较小的数量,直到我通过根,然后迭代直到我和#39; m在一些舒适的错误区域。
这里有一些伪代码:
def approx(a,b,i):
while ((1/2)**i) >= (1/2)**10:
while (another function is true):
modify values, record root = r
while (the same function above is false):
modify values, record root = r
return approx(a,b,i+1)
return(a,b,r)
这似乎不适用于Python,所以我想知道是否有人能指出我正确的方向。
编辑:包含我的实际代码:
from fractions import *
from math import sqrt
from math import fabs
def pweight(c,d):
if d > c:
return pweight(d,c)
else:
return [c+d,c,d]
def eweight(a,b):
if a == b:
return [a]
elif b > a:
return eweight(b,a)
else:
return [b] + eweight(a-b,b)
def weight(a,b,c,d):
if a*b/2 > c*d:
print("No Embedding Exists")
return (False)
else:
return (True, [c+d]+sorted((pweight(c,d) + eweight(a,b))[1:], reverse=True))
def wgt(a,b,c,d):
return ([c+d]+sorted((pweight(c,d) + eweight(a,b))[1:], reverse=True))
def red(a,i,k):
d=a[0]-a[1]-a[2]-a[3]
if any(item < 0 for item in a[1:]):
# print ("No Embedding Exists")
return (False, i)
elif d >= 0:
# print ("Embedding Exists! How many iterations?")
# print(i)
return (True, i)
elif d<0:
a=[a[0]+d,a[1]+d,a[2]+d,a[3]+d]+a[4:]
a=[a[0]]+sorted(a[1:],reverse=True)
k.append(a)
i=i+1
return red(a,i,k)
def works(a,b):
L = sqrt(a/(2*b))
w = weight(1,a,L,L*b)
return w[0] and red(w[1],0,[])
def inf(a,b,i):
while ((1/2)**(i+1)) >= (1/2)**(10)):
while works(a,b):
a = a - (1/2)**i
L = sqrt(a/(2*b))
while not works(a,b):
a = a + (1/2)**(i+1)
L = sqrt(a/(2*b))
return inf(a,b,i+1)
return (a,b,L)
我想输入&#34; inf(9,1,0)&#34;并让此代码返回接近(255 / 32,1,sqrt(255/64))的东西。主要问题是&#34;而工作(a,b):&#34;并且&#34;而不是工作(a,b):&#34;在函数&#34; inf(a,b,i)。&#34;我希望函数在&#34;之间交替运行&#34;并且&#34;虽然不起作用&#34;直到i = 9。
任何一般的想法都会受到赞赏(即,你如何在while循环中做某种交替功能)。
答案 0 :(得分:0)
如果你想在它们之间交替,不要把它们各自放在它们自己的while
循环中,放
while i < 9:
if works(a, b):
do something
if not works(a, b):
do something else
无论你在while
条件下测试什么,都需要在循环中的某个地方发生变化。否则你会得到一个无限循环。