专栏名称: 新语数据故事汇
《新语数据故事汇,数说新语》科普数据科学、讲述数据故事,深层次挖掘数据价值。
目录
相关文章推荐
成都发布  ·  3月30日起,去双流机场赶飞机有变! ·  19 小时前  
成都本地宝  ·  我不打算买房,成都公积金还有什么用? ·  3 天前  
成都本地宝  ·  成都5个严重被低估的古镇/村落!全部免费! ·  昨天  
51好读  ›  专栏  ›  新语数据故事汇

从代码到数学:斐波那契数的多重视角

新语数据故事汇  · 公众号  ·  · 2024-10-24 18:27

正文

最近刷到这个 https://code.golf/ 网站,即挑战用尽可能少的字符解决编码问题。这过程既有趣又让人沮丧,充满挑战性,同时也极具吸引力。

碰到一个熟悉的主题——斐波那契数(Fibonacci): https://code.golf/fibonacci#python,尝试用最简洁的代码实现31个斐波那契数的输出。

斐波那契数列是一个十分常见的、基础的数列,也成为黄金分割数列,它不仅在数学上占有重要地位,还广泛应用于自然界和计算机科学中。最简单的定义方式是通过递归来描述:

  • F(0) = 0

  • F(1) = 1

  • F(n) = F(n−1) + F(n−2)(n≥2)

这一数列的每个数都是前两个数之和,展现了自然界中诸多现象的规律,如植物生长、动物繁殖等。

尝试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=0b=1for 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,1for 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个字符还有差距。接下来各种尝试方式都是沮丧和失望了。

元组方式实现,通过解包和添加元素生成新的元组:

a






请到「今天看啥」查看全文