重庆分公司,新征程启航
为企业提供网站建设、域名注册、服务器等服务
代码有两个地方有问题
为清镇等地区用户提供了全套网页设计制作服务,及清镇网站建设行业解决方案。主营业务为网站建设、做网站、清镇网站设计,以传统方式定制建设网站,并提供域名空间备案等一条龙服务,秉承以专业、用心的态度为用户提供真诚的服务。我们深信只要达到每一位用户的要求,就会得到认可,从而选择与我们长期合作。这样,我们也可以走得更远!
1:19行的return缩进有问题,19行的return不应该出现在一个非方法的地方
2: 代码有可能出现死循环,在我输入a:10, b:10, c:10, d:10的时候出现死循环,请检查代码逻辑
我已经调整好了
def f(x):
s=(a*x)**3+(b*x)**2+(c*x)+d
return s
a=int(input("a"))
b=int(input("b"))
c=int(input("c"))
d=int(input("d"))
mid = 0
for i in range(-100,100,1):
x1=int(i)
x2=int(i+1)
if f(x1)*f(x2)0:
lo,hi=x1,x2
while hi-lo0.01:
mid=(lo+hi)/2
if f(lo)*f(mid)0:
hi=mid
else:
lo=mid
else:
pass
print mid
def erfen(low,high):
while low high:
mid=(low+high)/2
if f(low)*f(mid)0:
high=mid
elif f(mid)*f(high )0:
low=mid
return mid
这个函数没有结束 检查一下如何设置退出条件
首先二分法肯定需要一个“不断”二分的过程, 你的代码里面连一个循环都没有,肯定是不对的吧?
其次按照你的代码的思路,如果当前估算值guess的平法比x大,那就往0那边靠,否则就往1那边靠,这个好像也不对吧?
二分法的实现方法应该是,在区间[left, right]里面找x的开方,令估算值为guess等于区间的中点,如果guess比实际的大,那就把区间缩小一半,令到右端点移动到中点,如果guess比实际的小,也是将区间缩小一半,但是是令左端点移动到中点。这样每次缩小一半的区间,直到区间的长度非常非常小,那就认为区间的两个端点是相等的了,这个时候就得到了答案。
import math
def main():
x = input('x=')
n = 0
if x = 1 and x = 0:
left = 0.
right = 1.
while right - left = 0.0000001:
guess = (left + right) / 2.
if guess ** 2 - x = 0.0000001:
right = guess
else:
left = guess
#return guess
print 'sqrt(x) is', left
else:
print 'x should be in [0,1]'
if __name__ == '__main__':
main()
我按照你的思路又写了另外一种方法:
def second():
x = input('x=')
n = 0
if x = 1 and x = 0:
movelen = (1 + 0) / 4.
guess = (1 + 0) / 2.
while abs(guess ** 2 - x) = 0.0000001:
if (guess ** 2 - x) = 0.0000001:
guess = guess - movelen
else:
guess = guess + movelen
movelen = movelen / 2.
print 'sqrt(x) is', guess
else:
print 'x should be in [0,1]'
import math
def erfenfa(function, a, b): #定义函数,利用二分法求方程的根,function为具体方程,a,b为根的取值范围
start = a
end = b
if function(a) == 0:
return a
elif function(b) == 0:
return b
elif function(a) * function(b) 0:
print("couldn't find root in [a,b]")
return
else:
mid = (start + end) / 2
while abs(start - mid) 0.0000001:
if function(mid) == 0:
return mid
elif function(mid) * function(start) 0:
end = mid
else:
start = mid
mid = (start + end) / 2
return mid
def f(x):#定义构造方程式函数
return math.pow(x, 5) -15*math.pow(x, 4) +85*math.pow(x, 3)-225*pow(x,2)+274*x - 121
print(round(erfenfa(f, 1.5, 2.4),6))
因为你改变了列表l的大小,所以它输出的不是在原列表l的序号,而是在子列表的序号
因此不改变列表l,而只需要改变搜索范围,就能找到数的正确位置了.
完整的程序如下(改动的地方见注释)
def erfenfa(l,num,low,high): #这里增加两个参数
#low=0 #这里去掉这句
#high=len(l)-1 #这里去掉这句
mid=int((low+high)/2)#这里把len(l)/2改成(low+high)/2
if lowmid: #这里把len(l)1改成lowmid
if numl[mid]:
#l1=l[mid:] #这里去掉这句
erfenfa(l,num,mid,high) #这里增加两个参数
elif numl[mid]:
#l2=l[:mid] #这里去掉这句
erfenfa(l,num,low,mid) #这里增加两个参数
elif num==l[mid]:
print('exist',mid)
else:
print('not exist')
#return None #这里去掉这句
l=[1,2,3,10,20,30,50,60,100]
erfenfa(l,50,0,len(l)-1)
源代码(注意源代码的缩进)