首页 > 试题广场 >

如下程序的运行结果为: def func(s, i, j):

[单选题]
如下程序的运行结果为:
def func(s, i, j):
	if i < j:
		func(s, i + 1, j - 1)
		s[i],s[j] = s[j], s[i]
		
def main():
	a = [10, 6, 23, -90, 0, 3]
	func(a, 0, len(a)-1)
	for i in range(6):
		print a[i]
		print "\n"
		
		
main()

  • 3
    0
    ‐90
    23
    6
    10
  • 3
    0
    ‐60
    23
    6
    10
  • 6
    10
    3
    0
    ‐90
    23
  • 6
    10
    3
    0
    -23
    23
#####################  正确的排版应该如下所示
def func(s,i,j):
if i<j:
func(s,i+1,j-1)
s[i],s[j] =s[j],s[i]

def main():
a = [10,6,23,-90,0,3]
func(a,0,len(a)-1)
for i in range(6):
print(a[i])
print('\n')

main()

###########################################
解答:这是一道递归的题目
1.首先,调用main() 函数内,已经定义了一个列表 a ,传入到func函数内,第一次传入的参数中  i,j 分别代表列表的首位、末尾值。即
i = 0 ,j = 5  此时满足  i<j ,则此时调用 满足的条件 ,又调用func ,此时传入的参数为 a、1,4 。这时需要执行函数,而不能往下执行,即暂不可执行第一次的 交换元素 s[0],s[5] = s[5],s[0].
2. 执行内部函数 func(a,1,4)  则也满足 1<4  此时还需要再调用 func(a,2,3) .暂不执行 s[1],s[4]] =  s[4],s[1].
3.再执行内部函数 func(a,2,3) ,还是满足2<3 此时还需要再调用 func(a,3,2) .暂不执行 s[2],s[3]] =  s[3],s[2].
4.再执行内部函数func(a,3,2),此时不满足 3<2 . 即不执行任何内容。此时内部循环函数全部结束。再往上推。
5.上一步内部函数执行完后,则执行交换s[2],s[3]] =  s[3],s[2]. 再往上推
6. s[1],s[4]] =  s[4],s[1],再往上推
7. s[0],s[5] = s[5],s[0] 。即全部func结果结束。即交换了各个位置的元素。第一个变成最后一个、第二个变成倒数第二个、第三个变成倒数第三个。原来   的 a = [10,6,23,-90,0,3]
交换后的 a = [3,0,-90,23,6,10]
8. for循环依次打印出a列表元素 ,每次打出一个都进行换行操作。
答案为 A
###############################################################
【2019.9.18】       为了更好的说明,以上文字转为图片或许更好理解:

#####
执行代码和结果  如下图所示

编辑于 2019-09-18 09:25:46 回复(22)
这个问题的排版真的是要死了
发表于 2019-08-20 10:18:06 回复(0)
def func(s,i,j):
    if i<j:
        func(s,i+1,j-1)
        s[i],s[j] =s[j],s[i]

def main():
    a = [10,6,23,-90,0,3]
    func(a,0,len(a)-1)
    for i in range(6):
        print(a[i])
        print('\n')

main()


1.首先,调用main() 函数内,已经定义了一个列表 a ,传入到func函数内,第一次传入的参数中  i,j 分别代表列表的首位、末尾值。即
  i = 0 ,j = 5  此时满足  i<j ,则此时调用 满足的条件 ,又调用func ,此时传入的参数为 a、1,4 。这时需要执行函数,而不能往下执行,即暂不可执行第一次的 交换元素 s[0],s[5] = s[5],s[0].
2. 执行内部函数 func(a,1,4)  则也满足 1<4  此时还需要再调用 func(a,2,3) .暂不执行 s[1],s[4]] =  s[4],s[1]. 
3.再执行内部函数 func(a,2,3) ,还是满足2<3  此时还需要再调用 func(a,3,2) .暂不执行 s[2],s[3]] =  s[3],s[2]. 
4.再执行内部函数func(a,3,2),此时不满足 3<2 . 即不执行任何内容。此时内部循环函数全部结束。再往上推。
5.上一步内部函数执行完后,则执行交换s[2],s[3]] =  s[3],s[2]. 再往上推
6. s[1],s[4]] =  s[4],s[1],再往上推
7. s[0],s[5] = s[5],s[0] 。即全部func结果结束。即交换了各个位置的元素。第一个变成最后一个、第二个变成倒数第二个、第三个变成倒数第三个。原来   的 a = [10,6,23,-90,0,3]
      交换后的 a = [3,0,-90,23,6,10] 
8. for循环依次打印出a列表元素 ,每次打出一个都进行换行操作。
   答案为 A

发表于 2019-09-10 11:01:58 回复(0)
发表于 2019-12-30 15:48:02 回复(1)
s[i],s[j] =s[j],s[i]是交换两个元素的意思
发表于 2019-08-23 11:54:08 回复(0)
a = [10, 6, 23, -90, 0, 3]
已知:len(a) = 6
        i = 0
        j = 5
i < j =>    i+1,j-1 和        a[i],a[j] = a[j], a[i]              x, y = y, x python中交换两个变量的值
0<5 ->    func(a,1,4)      a[0],a[5] = a[5], a[0]         10, 3 = 3, 10         a = [3, 6, 23, -90, 0, 10]
1<4 ->    func(a,2,3)      a[1],a[4] = a[4], a[1]          6, 0 = 0, 6            a = [3, 0, 23, -90, 6, 10]
2<3 ->    func(a,3,2)      a[2],a[3] = a[3], a[2]          2, 3 = 3, 2            a = [3, 0, -90, 23, 6, 10]
3>2 !=> i<j
a = [3, 0, -90, 23, 6, 10]
发表于 2019-11-09 18:58:32 回复(0)
不知道python的代码是哪个傻***发的,从不打缩进,有些代码根本不好理解真正意思
发表于 2019-10-09 10:00:36 回复(0)
能不能好好排个版啊 看着太难受了
发表于 2020-06-02 22:58:05 回复(0)
高赞答案是正确的,不过,基于此我想到一个试题,用来检验输入顺序的,即在下面的图中,先print(a)还是先print('done')的问题。

(总是有水印不知道如何去掉了,挡着的那个是print(a,0,5)
结果为:

借鉴高票答案,我给了如下的步骤:

解释:当满足i<j的条件时,执行if里面的内容,当执行第一句即func(a,i+1,j-1)时,立马跳回到调用函数中,不进行元素替换和print(a)的操作。(需要注意,if对应的是else,这里隐含一个else: print('done')语句。)一直到i<j不成立,那么进行else,即print('done')。接着开始回朔,顺序为黄色箭头(颜色不是很清楚,因为实在没有其他颜色笔了)。
最后想说,上面的函数是没有return值的,所以如果写w = func(a,0,5),print(w)是得不到任何值的。如果再func(a,i,j)最后加一个return a,那么w就是a,同时上面的结果也会显示出来,但它们不属于w。
发表于 2020-05-25 23:12:21 回复(0)
递归,就是执行完这个,才能执行下一个,两个执行完了,表示这个执行完了,就可以执行下一个了
发表于 2020-02-12 10:20:40 回复(0)
正确的排版
发表于 2019-09-18 21:35:58 回复(0)
调用栈的思想,从栈顶弹出,依次执行函数
发表于 2019-08-24 23:44:33 回复(0)
恶心的排版。。
发表于 2019-09-01 17:29:56 回复(0)
有回答说:调用栈的思想,从栈顶弹出,依次执行函数
没学完数据结构,不明觉厉。
我是假设f(a,3,2) 的顺序是0 1 2 3 4 5,逐个带回去,发现f(a,0,5)的顺序是 5 4 3 2 1 0
发表于 2019-08-29 14:59:03 回复(0)
debug没弄明白, 画了个执行过程搞明白了
发表于 2023-05-15 20:47:59 回复(0)
晕死了真是,看了半个小时都看不懂
发表于 2022-11-23 16:21:18 回复(0)
观察func()函数可知该函数是用来将数组顺序颠倒。 数组元素个数为奇数时,会出现 i = j 的情况,a[i] = a[j]这个元素位置不变,剩余元素左右对称调换。 当元素个数为偶数时,会递归先调换中间那对数组元素,然后上推逐个对称调换。 所以此题将a数组内的元素对称调换即可。
发表于 2022-11-15 23:51:51 回复(0)
函数输入的是一个list和对应的2个index。
仔细观察发现,如果index是第一个小第二个大,那么就交换这两个index对应的list中的元素,并且相应的对index做一个加、减的操作。
如此进行递归。
递归好烦。
发表于 2022-07-28 14:55:36 回复(0)
ai aj=aj ai有没有大佬解释一下
发表于 2022-07-06 19:27:12 回复(0)
这是一道递归的题目
发表于 2021-12-22 08:02:08 回复(0)