最近刷到这个
https://code.golf/
网站,即挑战用尽可能少的字符解决编码问题。这过程既有趣又让人沮丧,充满挑战性,同时也极具吸引力。
碰到一个熟悉的主题——斐波那契数(Fibonacci):
https://code.golf/fibonacci#python,尝试用最简洁的代码实现31个斐波那契数的输出。
斐波那契数列是一个十分常见的、基础的数列,也成为黄金分割数列,它不仅在数学上占有重要地位,还广泛应用于自然界和计算机科学中。最简单的定义方式是通过递归来描述:
这一数列的每个数都是前两个数之和,展现了自然界中诸多现象的规律,如植物生长、动物繁殖等。
尝试1:函数方式实现
编写一个普通的函数来解决这个问题,并使用一个简单的for循环来调用fib函数,循环范围是i从0到30。
def fib(n):
a = 0
b = 1
for _ in range(n):
c = a + b
a = b
b = c
return a
for i in range(31):
print(fib(i))
尝试2:递归函数实现
大部分学习递归函数的时候都是以斐波那契数为示例的,最为经典的实现方式;这种计算效率有点低。
def f(n):
if n==0:return 0
if n==1:return 1
return f(n-1)+f(n-2)
for i in range(31):
print(f(i))
尝试3:循环的方式实现
上面的两种函数的方式,代码长度还是足够长,我们尝试去掉函数。
a=0
b=1
for i in range(31):
print(a)
c=a+b
a=b
b=c
继续以下面几种方法简化:
-
a=0
and
b=1
合并为一行
a,b=0,1
-
c=a+b
a=b
and
b=c
合并一行
a,b=b,a+b
-
for 循环后续语句合并为一行
-
将
range(31)
改为
[a]*31
,有9个字符减少到6个。
以下代码减少到42个字符并实现斐波那契数输出。42个字符与code.golf的排名差距比较大的,需要继续优化。
a,b=0,1
for i in [a]*31:print(a);a,b=b,a+b
尝试4:循环的逻辑转成字符串乘法,exec 执行
将循环内的逻辑
print(a);a,b=b,a+b
变成字符串,并使用字符串乘法生成循环逻辑,使用exec 执行之。
a,b=0,1;exec("print(a);a,b=b,a+b;"*31)
现在代码长度是38个字符,在code.golf上排名146,与最短的36个字符还有差距。接下来各种尝试方式都是沮丧和失望了。
元组方式实现,通过解包和添加元素生成新的元组: