递归算法 知识点题库

【加试题】计算表达式1+2+3+…+n的方法有很多种,以下程序代码体现了(   )的思想。

Function f(n As Integer) As Integer

  If n <= 1 Then

    f = 1

  Else

    f = n + f(n - 1)

  End If

End Function

A . 解析算法 B . 枚举算法 C . 查找算法 D . 递归算法
有如下一段VB程序。

Private Sub Command1_Click()

  Dim y As Long

  Text1.Text = ""

  y = f(3)

  Label1.Caption = Str(y)

End Sub

Function f(n As Integer) As Long

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

  If n <= 1 Then

     f = 1

  Else

     f = f(n - 1) + 2

  End If

End Function

程序运行时,单击命令按钮Command1后,文本框Text1中显示的内容是(   )

A . 1 B . 3 C . 123 D . 321
数学老师写了一组数列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
某VB程序使用了递归函数,代码如下:

Private Sub Command1_Click()

Text1.Text = f(3)

End Sub

Function f(x As Integer) As String

If x = 1 Then  f = 1  Else  f = f(x - 1) + 2

End Function

运行程序并点击按钮Command1后,文本框Text1中显示的内容是(   )

A . 1 B . 3 C . 5 D . 7
以下程序,单击按钮 Command1后,其结果是(  )

Private Sub Command1_Click()

Dim a As Integer, b As Integer

a = 5: b = 3

Print work(a, b)

End Sub

Function work(x As Integer, y As Integer) As Integer

If (x < y) Then

work = 0

Exit Function

End If

If (y = 0) Then

work = 1

Exit Function

End If

work = work(x - 1, y - 1) + work(x - 1, y)

End Function

A . 8 B . 9 C . 10 D . 11
有如下 VB 程序段: i = 1

Do While i <= 5

If i = 1 Or a(i - 1) <= a(i) Then i = i + 1

Else

t = a(i): a(i) = a(i - 1): a(i - 1) = t i = i - 1

End If Loop

数组元素a(0)到a(8)的初始值依次为“0,4,7,3,5,1,8,6,2”。执行该程序段后,数组元素a(1)到a(8)的值分别是

A . 1 3 4 5 7 8 6 2 B . 7 5 4 3 1 8 6 2 C . 4 7 3 1 2 5 6 8 D . 4 7 3 8 6 5 2 1
某VB程序使用了递归函数,代码如下:

Private Sub Commandl_Click()

    Text1.Text = f(3)

End Sub

Function f(x As Integer)As String

    If x = 1 Then f= 1 Else f = f(x-1)+ 2

End Function

运行程序并点击按钮Command1后,文本框Text1中显示的内容是(  )

A . 1 B . 3 C . 5 D . 7
小明设计了如下一个查找数据的程序:在一组升序的数列当中,查找不小于k的最小数的位置,如果该值存在,则返回其第一次出现的位置,如果不存在则返回0。程序界面如下:

  1. (1) 若在Text1中输入“8”,Tex2、Text3输出的分别为
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 10)As Integer

    Function find(L As Integer,R As Integer,key As Integer)

    As Integer

    If L>R Then

      find = 0:Exit Function

    Elself a(L)>= key Then

      find = L:Exit Function

    Else

        ① 

      If a(m)<key Then

        find = find(M + 1,R,key)

      Elself  ②  Then

        find = find(L,M - 1,key)

      Else

        find = M

      End If

    End If

    End Function

    Private Sub Command1_Click()

    Dim k As Integer

    Dim p As Integer

    k = Val(Text1.Text)

      ③ 

    Text2.Text = a(p)

    Text3.Text = Str(p)

    If p = 0 Then

      Text2.Text = "无"

    End If

    End Sub

    Private Sub Form_Load()

    a(1)= 3:a(2)= 3:a(3)= 3:a(4)= 4:a(5)= 7:a(6)

    =7:a(7)= 10:a(8)= 13:a(9)= 19:a(10)= 21

    For i= 1 To 10

      Listl.AddItem Str(a(i))

    Next i

    End Sub

小明设计了如下一个查找数据的程序:在一组升序的数列当中,查找不小于k的最小数的位置,如果该值存在,则返回其第一次出现的位置,如果不存在,则返回0。程序运行界面如图所示,VB程序代码如下,请回答下列问题:

  1. (1) 若在Text1中输入“8”,则Text2、Text3中输出的分别为
  2. (2) 请在划线处填入合适的代码。

    Dim a(1 To 10)As Integer

    Function find (L As Integer, R As Integer, key As Integer) As Integer

    If L>R Then

    find=0:Exit Function

    ElseIf a(L)>=key Then

    find=L: Exit Function

    Else

    If a(m)<key Then

    find=find(M+1, R, key)

    Else If Then

    find=find(L, M-1, key)

    Else

    find=M

    End If

    End If

    End Function

    Private Sub Command1_Click( )

    Dim k As Integer

    Dim p As Integer

    k=Val(Text1.Text)

    Text2.Text=Str(a(p))

    Text3.Text=Str(p)

    If p=0 Then

    Text2.Text="无"

    End If

    End Sub

    Private Sub Form_Load( )

    a(1)=3: a(2)=3: a(3)=3: a(4)=4: a(5)=7: a(6)=7

    a(7)=10: a(8)=13: a(9)=19: a(10)=21

    For i=1 To 10

    List1.AddItem Str(a(i))

    Next i

    End Sub

有如下VB程序:

Function f(i As Integer)

If i=1 Then

f=2

Else

f=2 * 10^(i-1)+f(i-1)

End If

End Function

Private Sub Command1_Click()

Dim n As Integer,s As Integer,i As Integer

n=Val(Text1.Text)

s=0

For i=1 To n

s=s+f(i)

Next i

Labell.Caption=Str(s)

End Sub

若在Textl中输入5,则Labell中显示的内容为(  )

A . 22222 B . 24690 C . 20000 D . 2468
对n项(n<=100)数据序列的前x项求和,可设计如下算法:将数据序列存储在数组a中,并按一定规则转换成数组c,再借助数组c实现求和.

将数组a转换成数组c的方法描述如下:

①将数组a中的元素依次存储到数组c中,把当前数组c看作第一层;

②把第一层中的各元素进行如下处理:奇数项值不变,偶数项的值更新为自己与自己前一项的和,将更新后的数组元素看作第二层;

③把第二层中的各元素,按上述方法进行同样操作,更新后的数组元素看作第三层;

④以此类推,直到当前层中仅有一项为止。

例如x=11时,转换过程如图所示:

借助数组c,可快速计算出数组a中前x项的和.例如,数组a中前11项的和,可由表达式c(11)+c(10)+c(8)得到.表达式具体分析过程如下:

②表达式第一项为c(11);

②将下标11转换成二进制数1011,计算该二进制数最右边的“1”所对应的权值,再用11减去此权值得到10,即表达式第二项为c(10);

③按上述方法继续操作,直到计算结果等于0为止。

小龙依据上述方法设计了如下vb程序.请回答下列问题:

  1. (1) 计算数组a中前22项和的表达式为(填写表达式,如c(11)+c(10)+c(8))。
  2. (2) 请在划线处填入合适的代码。

    Dim n As Integer

    Dim a(1 To 1000) As Long, c(1 To 1000) As Long

    Private Sub Form_Load()

    '读取n个数据,并存储到数组a中(代码略)

    End Sub

    Private Sub Command1_Click()

    Dim i As Integer, j As Integer, k As Integer, space As Integer

    For i = 1 To n

    c(i) = a(i)

    Next i

    k = 2 '当前层第一个偶数项的位置

    space = 1 '当前层偶数项与前一项的间距

    Do While k <= n

    For i = k To n Step k

    c(i) = c(i) + c(i - space)

    Next i

    k = k * 2

    Loop

    End Sub

    Private Sub Command2_Click()

    Dim x As Integer, sum As Long

    x = Val(Text1.Text): sum = 0

    Do While x <> 0

    sum = sum + c(x)

    Loop

    Text2.Text = Str(sum)

    End Sub

    Function lowbit(x As Integer) As Integer

    Dim temp As Integer

    temp = x: lowbit = 1

    Do While ③'

    lowbit = lowbit * 2

    temp = temp \ 2

    Loop

    End Function

结合分治策略,递归也可以用三个字概况。分:将原有问题成K个子问题;治:对这K个子问题。如果子问题的规模仍然不够小,则将其再分解为K个子问题,如此进行下去,直到问题足够小时,就很容易求出子问题的解。合:将求出的小规模问题的解为一个更大规模问题的解,自下而上逐步求出原问题的解。
结合分治策略,递归也可以用三个字概况。分:将原有问题成K个子问题;治:对这K个子问题。如果子问题的规模仍然不够小,则将其再分解为K个子问题,如此进行下去,直到问题足够小时,就很容易求出子问题的解。合:将求出的小规模问题的解为一个更大规模问题的解,自下而上逐步求出原问题的解。
有如下程序段:

Dim i As Integer,Sum As Integer

Dim a(1 To 11)As Integer

i=10:a(11)=49

Do While i>=1

    a(i)=a(i+1)-1

    If a(i)Mod 3=0 Then Sum=Sum+a(i)

    i=i-1

Loop

Text1.Text=Str(Sum)

该程序段运行后,文本框Text1中显示的内容是(  )

A . 174 B . 180 C . 36 D . 42
F(n)=F(n-1)+2*F(n-2),F(l)=l,F(2)=2;当n=4时,F的值是(   )。
A . 8 B . 12 C . 16 D . 20
上台阶:每一步只能迈上1个或2个台阶,上完n级台阶,一共有多少种走法,下面说法正确的是(    )
A . 用递归算法,递归关系式为f(n)=f(n-1)+2 B . 用递归算法,递归关系式为f(n)=f(n-1)+f(n-2) C . 用递归算法,递归关系式为f(n)=f(n+1)+f(n+2) D . 用递归算法,递归关系式为f(n)=f(n-1)*2
汉诺塔游戏中,如果有n个木盘,第n个木盘是最大的木盘,用递归的方法求解,将n个木盘从A杆移动到C杆,需要借助中间的B杆。只要超过一个木盘,在移动过程中,总会存在起始杆、过渡杆及目标杆的问题。因此,定义函数时,用到了4个参数: hanoi(n,s,m,t), n表示需要移动的盘子数量,s表示盘子的起始杆,m表示中间过渡杆,t表示目标杆,如图所示。

阅读下列程序。

def hanno(n,s,m,t):

    if n==1:

        print(s,'-->',t)  

    else:

        hanno(n-1,s,t,m)

        print(s,'-->',t)

        hanno(n-1,m,s,t)

#主程序

n=int(input('请输入汉诺塔的层数:'))

hanno(n,'A','B','C')

input("运行完毕,请按回车键退出...")

下列说法错误的是(    )

A . 此递归没有终止结束条件 B . print(s,'-->',t)表示A杆上当前最后木盘移动到C杆上 C . hanno(n-1,s,t,m)表示A杆有n个盘子现将前n-1个盘子从A杆移动到B杆上 D . hanno(n-1,m,s,t)表示将B杆上的n-1个盘子移动到C杆上
汉诺塔游戏中,如果有n个木盘,第n个木盘是最大的木盘,用递归的方法求解,将n个木盘从A杆移动到C杆,需要借助中间的B杆。只要超过一个木盘,在移动过程中,总会存在起始杆、过渡杆及目标杆的问题。因此,定义函数时,用到了4个参数: hanoi(n,s,m,t), n表示需要移动的盘子数量,s表示盘子的起始杆,m表示中间过渡杆,t表示目标杆,如图4.3.4所示。

阅读下列程序。

def hanno(n,s,m,t):

    if n==1:

        print(s,'-->',t)  

    else:

        hanno(n-1,s,t,m)

        print(s,'-->',t)

        hanno(n-1,m,s,t)

#主程序

n=int(input('请输入汉诺塔的层数:'))

hanno(n,'A','B','C')

input("运行完毕,请按回车键退出...")

下列说法错误的是(    )

A . 此递归没有终止结束条件 B . print(s,'-->',t)表示A杆上当前最后木盘移动到C杆上 C . hanno(n-1,s,t,m)表示A杆有n个盘子现将前n-1个盘子从A杆移动到B杆上 D . hanno(n-1,m,s,t)表示将B杆上的n-1个盘子移动到C杆上
下列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 . 递归算法
下列选项中,递归算法不一定包括的是(     )。
A . 递推部分 B . 回归部分 C . 终止条件 D . 循环结构