For else语法最直观的理解

看到python算法简介里面的名人问题。算法的思路网上比较多,大概写一下。这里记录的是一个语法小知识点,因为自己一直用不好,看到了这个用法最简单直观的方法。

问题简介:

在一个房间里有 N 个人,其中一个是名人,大家都认识他,但他不认识任何人。其他人可能认识房间里面的一部分人。

你可以问任何人问题,但是问题只能是:你认识 某人吗,对方回答 Yes or No. 请问最少要问多少个问题才能把名人找出来?

解题:

依次问他是否认识他的下一个,比如 2, 如果 1 说认识,那么 1 一定不是名人,2 有可能是名人; 如果1 说不认识,2 一定不是名人,1 却有可能是名人。依次问下去,直到第 N 个人。我们问 (N - 1) 个问题就可以把名人找出来。

算法的For Else:

def celeb(G):
    n = len(G)
    u, v = 0, 1                 # The first two
    for c in range(2,n+1):              # Others to check
        if G[u][v]: u = c       # u knows v? Replace u
        else: v = c             # Otherwise, replace v
    if u == n: c = v            # u was replaced last; use v
    else: c = u                 # Otherwise, u is a candidate
    for v in range(n):          # For everyone else...
        if c == v: continue             # Same person? Skip.
        if G[c][v]: break       # Candidate knows other
        if not G[v][c]: break           # Other doesn't know candidate
    else:
        return c            # No breaks? Celebrity!  MARK~~~~~~~~~~~~~~~~~~~~
    return None                 # Couldn't find anyone
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取啥都被占用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值