4.3 非数值计算 知识点题库

数学老师写了一组数列1,4,7,10,13,……求前N项的和,小明想用递归算法来完成,那么他设计的递推公式正确的是(   )。
A . f(1)=1: f(n)=n*2-1 B . f(1)=1: (n)=n*2+1 C . f(1)=1: f(n)=n+3 D . f(1)=1: f(n)=f(n-1)+3
【加试题】对分查找算法可用于求解方程的近似解。现要求方程x3-4x2+x+5=0的一个近似解,可设f(x)=x3-4x2+x+5,若有区间[a,b],使f(a)与f(b)异号,则该区间内必存在该方程的一个解。小吴为此编写了VB程序,功能如下:分别在文本框Text1和Text2中输入求解的区间值a和b(a<b),单击“计算”按钮Command1,若该区间必有解,则求解出该区间内的一个近似解(精确到10 s),否则提示“重新输入区间”,计算后的相关结果显示在列表框List1中。程序运行界面如图所示。

实现上述功能的VB程序如下,但加框处代码有错,请改正。

Function f(x As Double)As Double

    Dim Y As Double

    y=x^3-4*x^2+x+5:              ‘(1)

  End Function

  Private Sub Command1_Click()

    Dim a As Double,b As Double,m As Double,x As Double

    a=Val(Text1.Text):b=Val(Text2.Text)

    If f(a)*f(b)<0 And a<b Then

       Do While a<=b

       m=(a+b)/2

       If Abs(f(m))<0.00001 Then Exit Do

       If <0 Then         ‘(2)

          b=m

       Else

          a=m

       EndIf

      Loop

      x=Format(m,“0.00000”)      ‘Format函数用于定义输出的小数位数

      List1.AddItem"["&Text1.Text&","&Text2.Text&"]" & "解为:"&x

    Else

      List1.AddItem"["&a&","&b&"]" & "重新输入区间"

    EndIf

End Sub

  1. (1) ⑴处改为
  2. (2) ⑵处改为
我们在用计算机解决问题时,常采用递归法。已知:f(3)=3;当n>3时,f(n)=f(n-1)*n;编程求f(5)的值。下列结果正确的是(  )
A . 120 B . 60 C . 3 D . 23
小明用VB编写了查找第二小的数的程序界面如图所示,程序随机产生50个范围在1~1000之间的随机整数,单击“查找”按钮能够在标签 Label1中显示第二小的数字。

Private Sub Command1_ Click( )

  Dim n As Integer, i As Integer

  Dim a(1 To 50) As Integer

  Randomize

  For i=1 To 5

        ①      

    List1 AddItem Str(a(i))

  Next i

  If a(1) < a(2) Then

    firstmin=a(1)

    secondmin =a(2)

  Else

    firstmin=a(2)

    secondmin=a(1)

  End if

  For i=3 To 50

    If a(i) < secondmin Then

      If        ②        then

        Secondmin = firstmin

        firstmin = a (i)

      Else

                 ③         

      End If

    End If

  Next i

  Label1. Caption = "第二小的数是" str(secondmin)

End Sub

  1. (1) 为了在列表框List1中加入随机产生的数字,小明在程序中写了语句 “List1. AddItem Str(a(i))”,其中Addltem是List1对象的。(填字母:A .属性/B .事件/C .方法)
  2. (2) 为实现上述功能,请在划线处填入合适的代码。

     ② ③ 

若数组元素d(1)到d(8)的值依次为“86,75,58,46,20,18,12,5”,查找某Key值的VB程序段如下:

n=0:i=1:j=8

Key=Val(Text 1.Text)

Do While i<=j

     m=(i+j)\2

     If Key=d(m) Then Exit Do     ‘Exit Do表示退出循环

     If Key>d(m) Then

       j=m-1:n=n-1

     Else

       i=m+1:n=n+1

     End If

Loop

Label 1.Caption=Str(n)

当输入不同的Key值, 运行该程序段后, 在标签Label1中显示的不同结果共有(  )

A . 5种 B . 6种 C . 7种 D . 8种
数组a中存储的是一组正整数,特征是:以三个数为一组,每组中任意一个数都比前面一组中的任意一个数要大;②每组中三个数依次递减;③数组中数的总个数为3的倍数。依据对分查找思想,设计一个在数组a中查找数据key的程序。实现该功能的VB程序如下,但加框处代码有错,请改正。

Private Sub Command 1_Click()

  Const n = 15

  Dim a(1 To n)As Integer,search As Integer,key As Integer

  Dim i As Integer,j As Integer,m As Integer

  '读取一组正整数,按上述规则存入数组a中,代码略

  key = Val(Text1.Text)

  i = 1:j = n:search = 0

  Do While i <= j

    m =(i+j)\2

    If m Mod3<>0 Then m=      ‘⑴把m调整到三个数一组的最后一个数的位置

    If key = a m)Then

      search = m:Exit Do

    Elself key <a(m)Then

      j = m - 3

    Elself  Then    ‘⑵

      i= m + 1

    ElseIf key = a(m-2)Then

      search = m-2 :Exit Do

    ElseIf key = a(m- 1)Then

      search = m-1:Exit Do

    Else

      search = 0:Exit Do

    End If

  Loop

  If search <>0 Then

    Text2.Text = Str(search)

  Else

    Text2.Text ="找不到"

  End If

End Sub

 ⑵ 

数组a为一组正整数,前部分为升序,后部分为降序。设计vb程序查找数组a中的最大值及其位置。实现该功能的程序段如下:

  i=1:j=n

flag=False

Do While i<=j And Not flag

  m=(i+j+1)\2

  If a(m) <a(m-1) And a(m) >a(m+1) Then

    

  ElseIf a(m) >a(m-1) And a(m) >a(m+1) Then

    

  ElseIf a(m) >a(m-1) And a(m) <a(m+1) Then

    

  End If

Loop

list1.Add Item Str(a(m) ) &Str(m)

上述程序方框出可选语句为:i=m+1②j=m-1③flag=true

则(1)、(2)、(3)处语句依次是(  )

A . ①②③ B . ①③② C . ③①② D . ②③①
某对分查找算法的VB程序段如下:

i= 1 : j =9 : n =0

key=Val(Text1.Text)

Do While i<= j

N=n+1

M=Fix((i + j) / 2)

If key = d(m) Then Exit Do

If key<d(m) Then j= m - 1 Else i=m+1

Loop

数组元素d(l)到d(9)的值依次为“7,12,18,25,39,58,61,72,86”。若该程序段运行结束后,n的值为2,则key的值是(  )

A . 39 B . 18或61 C . 18或72 D . 12或61
某对分查找算法的 VB 程序段如下:

n  = 0: i = 1: j = 6

Key = Val(Text1.Text)

Do While i <= j

  m = (i + j) \ 2

  n = n + 1

  If Key = d(m) Then Exit Do

  If Key < d(m) Then j = m - 1 Else i = m + 1

Loop

If i <= j Then  s = m - n Else  s = n

数组d(1)到d(6)的值依次为“4,6,9,13,20,25”,输入某个Key值后,运行该程序段后,变量s结果为3,则输入key的值不可能是(   )。

A . 25 B . 20 C . 5 D . 3
某算法程序段如下:

Dim a(1 To 10) As Integer

Dim i As Integer, j As Integer

Dim key As Integer

i = 1: j = 10: n = 0

Randomize

key = Int(Rnd * 10) * 2 + 1

Do While i <= j

  m = Int((i + j) / 2 + 0.5)

  If key = a(m) Then

    Exit Do

  ElseIf key > a(m) Then

    j = m - 1: n = n - 1

  Else

    i = m + 1: n = n + 1

  End If

Loop

Text1. Text = Str (n)

已知数组元素a(1)至a(10)的值依次为20,19,17,16,14,11,8,5,2,0若执行该程序后,文本框Text1中显示的内容不可能是(    )

A . -3 B . -2 C . -1 D . 1
数组a中存放了7位同学的身高(单位:厘米),若用对分查找算法查找数值168,则依次被访问到的数组元素是(     )。

a[1]

a[2]

a[3]

a[4]

a[5]

a[6]

a[7]

188

177

175

172

168

166

155

A . a[4],a[6],a[5] B . a[2],a[6],a[5] C . a[1],a[7],a[5] D . a[7],a[6],a[5]
斐波那契数列又称黄金分割数列,指的是这样一个数列:0,1,1,2,3,5,8,13,21,34……在数学上,斐波那契数列以下面的方法来定义:

F(0)=0 (n=0)

F(1)=1 (n=1)

F(n)=F(n-1)+F(n-2) (n≥2)

输出斐波那契数列中第10个数的Python程序如下:

def fib(n):

    a,b= 0,1

    for i in range(n):

       

return a

print(fib(10))

关于加框处的代码,下列说法正确的是(     )

A . 最多执行1次 B . 最多执行9次 C . 交换a和b的值 D . 从数列中的第三项起,每一.项都是它 相邻的前两项之和
下列程序是用二分法从给定的有序数中查找并打印指定数的位置的代码。

def search(x,nums):

    low = 0

    heigh = len(nums)-1

    while low <=heigh:

        mid =   ①   

        if x == nums[mid]:

            return mid

        elif x > nums[mid]:

            low =   ②  

        else:

            heigh =   ③  

    return -1

nums =[2,4,8,9,10,20,30,77,88,100]

num = int(input("请输入你要查找的数:"))

print("你要找的数在数组从0开始的第",search(num,nums),"个位置")

下列说法正确的是(    )

A . ①的位置为(low+heigh)//2,②的位置为mid-1,③的位置为mid+1 B . ①的位置为(low+heigh)//2,②的位置为mid+1,③的位置为mid-1 C . ①的位置为(low+heigh)/2,②的位置为mid-1,③的位置为mid+1 D . ①的位置为(low+heigh)/2, ②的位置为mid+1,③的位置为mid-1
某对分查找算法的VB程序段如下:

s=0;i=1:j=7

Do While i<=j

    m=(i+j)\2

    If Key = a(mi) Then Exit Do

    If Key < a(m) Then j=m-1:s=3ks+2Else i=m+1:s=3ks

Loop

数组a(1)到a(10)的值依次为“2,6,7,15,20,24,27”,执行该程序段后,s的值为6,则key的值可能是(    )

A . 6或23 B . 7或2 C . 6或20 D . 7或23
有如下VB 程序段:

For p = 1 To 6

    i = 1: j = 6: q = 0

    Do While i <= j

        m = (i + j) \ 2

        q = q + 1

        If p = m Then

            f(p) = q: Exit Do       ' Exit Do 表示退出循环

        End If

        If p > m Then i = m + 1 Else j = m - 1

    Loop

Next p

数组元素f(1)到f(6)初始为0,执行该程序段后,其值依次是(     )

A . 2,3,1,3,2,3 B . 3,2,3,1,2,3 C . 2,3,1,3,3,2 D . 3,2,1,3,2,3
某对分查找的VB程序如下:

i = 1: j = 8 : n = 0

key = Val(Text1.Text)

Do While i <= j

    m = (i + j- 1) \ 2

    n=n+1

    If a(m) >=key Then

        i = m + 1

    Else

        j = m - 1

    End If

Loop

Label1.Caption=Str(n)+Str(i)

数组元素a(1)到a(8)的值依次为“ 35,32,29,26,21,19,16,12”。在文本框Text1中输入17,执行该程序段后,标签Label1上显示的内容是(      )

A . 3 7 B . 2 7 C . 4 8 D . 2 8
下列VB程序模块可以计算正整数n阶乘(n!)的值,该模块采样的算法是(    )

Function f(n As Integer) As Long 

    If n<=1 Then

        f= 1

    Else

        f=n* f(n-1)

    End If

End Function

A . 枚举算法 B . 查找算法 C . 排序算法 D . 递归算法
有VB程序段如下:

n= Va1(Text1. Text)

k=0

left= 1

right= n

Do While left < = right

    k=k+1

    m=(left+ right)\2

    If m-left< right- m Then

        left=m+1

    Else

        right= m- 1

    End If

Loop

在文本框Text1l中输入16,执行该程序段,下列说法错误的是(    )

A . 程序运行后k的值是4 B . 程序运行后m的值是16 C . 程序运行后right的值是15 D . 程序运行后left的值是16
有n个连续的自然数,删除首尾两端之外的其中一个数后存储在数组元素a(1)到a(n- 1)中,利用对分查找算法找出这个数的某VB程序段代码如下:

Const n= 10

i=1 : j=n-1

Do While j-i>=2

    m=(i+j) \ 2

    If    ⑴    Then

        i= m

    Else

           ⑵   

    End If

Loop

Text1. Text= Str(3) )

上述程序中(1)(2)(3)划线处可选语句有:

①a(j)-a(m)=j-m②a(m)-a(i)=m-i③j=m-1④j=m⑤a(i)+1⑥a(i)

则上述程序中(1)、(2)、(3)划线处的代码依次为(     )

A . ①③⑤ B . ②④⑤ C . ①③⑥ D . ②④⑥
采用如下对分查找算法对数组a(1)到a(8)中8个有序数据“1,5,8,13,16,27,31,39”进行查找,其程序如下:

i =1 : j=8 : x=27 : mark = False

Do While i <= j And Not mark

    m=(i+j+1)\2

    If a(m) = x Then mark = True

    If a(m)>x Then j=m-1 Else i=m+1

    Text1. Text = Text1. Text+Str(m)

Loop

执行该程序段,文本框Text1中显示的是(    )

A . 46 B . 476 C . 163127 D . 576