python

挑战极短代码之一:3种经典思路

2021-01-26  本文已影响0人  Python_Camp

今天的任务

简单的规则。你的函数输入4和7。如果输入了4,函数应该返回7。如果输入了7,函数应该返回4。其他任何输入都应该返回一个false值,比如False、0、[],""。

边界限制条件:函数不能包含if语句或者eval函数,由于使用它可以绕过if要求!
有一些非常简单的方法来回答这个问题,但我鼓励你尽可能地尝试和创新。

非常简单的任务,但是做到极简就需要深入且灵活地掌握python的逻辑特性。

1、布尔运算的妙处

def solution(n):

    return 4 if n == 7 else 7



显然以上写法无法满足4,7之外的情况,而且还用到了if语句

那么,该如何破冰开脑洞呢?



布尔运算,往往是一条路,当上帝关上if这扇门,还好会留给

我们另外一扇门 logic operate



# first solution

def solution(n):

    return 4*(n==7) + 7*(n==4)



字典也是好办法,特别是.get(n)简直是解决不存在键值的

大杀器!非常感谢发明get用法的开发者!!



# second solution

def solution(n):

    return {4:7, 7:4}.get(n)

2、库函数的妙处
第2个栗子是之前的课堂上,我们遇到过另外一个任务:输入月份:7(月)输出季度:3(季度)
详解见下面链接 [自学编程之八:简洁优雅的魅力

3、数论规律本质****数论往往与编程形影相随,举第3、第4两个栗子!****第3个栗子的代码也非常精悍
[自学第四课:问题理解越深刻,代码越高效简洁]

第4个栗子 [自学编程第三课:尝试解决感兴趣的问题]

运用上面的******数论规律本质,**思考著名的汉诺塔问题留给同学们。
任务要求是每次搬动大环不能放在小环上面!****输入:环的数量****输出:搬动的次数
思路分析:汉诺塔是领悟递归思想的最佳任务。
4个环搬动过程可以这样看为先完成上面3个环的搬动,再搬动最下面也是最大的环搬动。

假设搬动n个环需要的次数为 move(n), move是定义的函数名
那么看f(n)是下面步骤搬动次数之和。

以上图的8个环需要搬动的次数是move(8)
首先完成7个环搬动到中间柱子,左边柱子露出底部最大的环,
需要搬动的次数为 move(7)

接着再将最大的环搬动到右边柱子,增加了一次
即move(7)+1

这时,最左边的柱子空出来恰好作为中转。
7个环继续借助空出来的左柱,向右柱转移
需要搬动的次数也是 move(7)

以上操作满足规则:借助一个空的柱子,能够保证每一次搬动较小的环都会放在较大环上面。

递归思想:n个环的搬动次数 = n- 1个环的搬动次数 * 2 + 1

​
def hanoi(disks,move=0):

    if disks == 1:

        move += 1

        return move

    elif disks == 2:

        move += 3

        return move

    else:

        return 2*hanoi(disks-1,move)+1    

# 似乎有数学的规律显露出来,代码极为精悍!

def hanoi(disks):

    return 2 ** disks - 1
上一篇 下一篇

猜你喜欢

热点阅读