鱼C论坛

 找回密码
 立即注册
查看: 1256|回复: 12

一道看不懂的函数题目

[复制链接]
发表于 2019-6-28 19:30:11 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def ins_sort_rec(seq, i):
    if i == 0: return
    ins_sort_rec(seq, i - 1)
    j = i
    while j > 0 and seq[j - 1] > seq[j]:
        seq[j - 1], seq[j] = seq[j], seq[j - 1]
        j -= 1

seq = [3,-6,79,45,8,12,6,8]
ins_sort_rec(seq, len(seq)-1)
print(seq[5])

可以简单讲述一下下代码的运行过程吗
是一道理论题 要求结果
运行结果为12  但是直接在纸上写 不知道是怎样的过程
谢谢!!!!
┭┮﹏┭┮
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2019-6-28 19:41:18 | 显示全部楼层
就是一个升序排序的算法,用了递归函数。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-28 19:51:06 | 显示全部楼层
newu 发表于 2019-6-28 19:41
就是一个升序排序的算法,用了递归函数。

嗯  但是我不太明白具体的过程
第一次 i 取7  然后呢j=7 seq[6]>seq[7] 不成立了 下一步该怎么办呢
还是我理解出了错误QAQ
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 19:56:23 | 显示全部楼层
呃,大概就是一个排序算法,冒泡排序吧,就是一圈一圈的循环比较相邻的两个数字,把大的放后面小的放前面,这样把列表  [:1]的数比较一遍,然后再把[:2]的数比较一遍,再比较[:3]的数。。。。就这样一直比较到[:len(seq)-1]的数,就也是全部数组比较一遍,然后给出一个顺序的数组
排序前   seq = [3,-6,79,45,8,12,6,8]
排序后   seq = [-6,3,6,8,8,12,45,79]
所以 seq[5] == 12
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 19:59:20 | 显示全部楼层
超级新手 发表于 2019-6-28 19:51
嗯  但是我不太明白具体的过程
第一次 i 取7  然后呢j=7 seq[6]>seq[7] 不成立了 下一步该怎么办呢
还 ...

额,是这样的,这个是一个递归的插入排序,
它先开始会一直执行这个ins_sort_rec(seq, i - 1)递归函数,
直到i-1等于0的时候,才会执行下边的语句, 此时 i = 1, 然后层层向上


                               
登录/注册后可看大图
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 20:06:01 | 显示全部楼层
超级新手 发表于 2019-6-28 19:51
嗯  但是我不太明白具体的过程
第一次 i 取7  然后呢j=7 seq[6]>seq[7] 不成立了 下一步该怎么办呢
还 ...

这是它的非递归版本,先研究下
  1. def ins_sort(seq):
  2.     for i in range(1,len(seq)):
  3.         j = i
  4.         while j>0 and seq[j-1]>seq[j]:
  5.             seq[j - 1], seq[j] = seq[j], seq[j - 1]
  6.             j -= 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 20:18:33 | 显示全部楼层
外层循环用递归的冒泡排序
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-28 20:36:06 | 显示全部楼层
newu 发表于 2019-6-28 20:06
这是它的非递归版本,先研究下

嗯嗯这个非递归版本的我明白了
冒泡排序的方法
  if i == 0: return
    ins_sort_rec(seq, i - 1)
    j = i
但是原题这里还是不太明白
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 20:42:20 | 显示全部楼层
超级新手 发表于 2019-6-28 20:36
嗯嗯这个非递归版本的我明白了
冒泡排序的方法
  if i == 0: return

我把关键的地方分解一下:

seq = [3,-6,79,45,8,12,6,8]
ins_sort_rec(seq,7)
   i不等于0
   ins_sort_rec(seq,6)
      i不等于0
      ins_sort_rec(seq,5)
         i不等于0
         ins_sort_rec(seq,4)
            i不等于0
            ins_sort_rec(seq,3)
               i不等于0
               ins_sort_rec(seq,2)
                  i不等于0
                  ins_sort_rec(seq,1)
                     i不等于0
                     ins_sort_rec(seq,0)
                         i终于等于0了,返回
                     这里就开始执行剩下没执行的代码
                     j=i
                     while...
                 j=i
                 while...
              ....
          ....
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-28 21:13:52 | 显示全部楼层
newu 发表于 2019-6-28 20:42
我把关键的地方分解一下:

seq = [3,-6,79,45,8,12,6,8]


i=0
j=0
while j>0 这里好像就不成立了?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 21:17:34 | 显示全部楼层
超级新手 发表于 2019-6-28 21:13
i=0
j=0
while j>0 这里好像就不成立了?


抱歉我对齐偏差了,应该是i = 1,j = 1,执行完之后,再执行上个函数调用剩下的代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-6-28 23:30:39 | 显示全部楼层
newu 发表于 2019-6-28 21:17
抱歉我对齐偏差了,应该是i = 1,j = 1,执行完之后,再执行上个函数调用剩下的代码

再执行上个函数调用剩下的代码 是什么意思呀
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2019-6-28 23:33:24 | 显示全部楼层
超级新手 发表于 2019-6-28 23:30
再执行上个函数调用剩下的代码 是什么意思呀


def ins_sort_rec(seq, i):
    if i == 0: return
    ins_sort_rec(seq, i - 1) # 这个函数递归总有结束的时候吧
   # 下边就是剩下的代码
    j = i
    while j > 0 and seq[j - 1] > seq[j]:
        seq[j - 1], seq[j] = seq[j], seq[j - 1]
        j -= 1
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2026-1-16 15:20

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表