整數序列之Recaman's sequence:python求值和視覺化

△ Recaman's sequence:

1 即:Recamán‘s sequence或者recaman sequence,屬於有特色的整數序列之一。

2 序列前10:

0, 1, 3, 6, 2, 7, 13, 20, 12, 21……

3 特點:

整數序列之Recaman

4 追溯:

最早提出:N。 J。 A。 Sloane and Simon Plouffe, May 16 1991。

正式出現:Term in Recamán’s sequence A005132 where n appears for first time。

5 查詢:

整數序列線上百科全書:On-Line Encyclopedia of Integer Sequences

網址:

https://oeis。org/wiki/Welcome

6 查詢方法:

recaman sequence或者0, 1, 3, 6, 2, 7, 13, 20, 12, 21或者A005132

7 視覺化前10的recaman sequence:

整數序列之Recaman

圖1

△ python程式碼求recaman sequence:

方法一:13行程式碼

def recaman(n): seq = [] curr = 0 for i in range(n): back = curr - i forward = curr + i if back > 0 and back not in seq: seq。append(back) curr = back else: seq。append(forward) curr = forward return seq

方法二:12行程式碼

def recaman(n): seq = [] for i in range(n): if(i == 0): curr = 0 else: curr = seq[i-1]-i if(curr>=0 and curr not in seq): seq+=[curr] # seq。append(curr) else: seq+=[seq[i-1]+i] # seq。append(seq[i - 1] + i) return seq

方法三:11行程式碼

def recaman(n): seq = [] curr = 0 for i in range(0, n): if( not(curr-i in seq) and (curr-i > 0)): seq。append(curr-i) curr -= i else: seq。append(curr + i) curr += i return seq

方法四:10行程式碼

def recaman(n): seq = [0] * n for i in range(1, n): curr = seq[i-1] - i for j in range(0, i): if ((seq[j] == curr) or curr < 0): curr = seq[i-1] + i break seq[i] = curr return seq

方法五:8行程式碼,推薦

def recaman(n): seq=[0]*n for i in range(1, n): if seq[i - 1] - i > 0 and seq[i - 1] - i not in seq: seq[i] = seq[i - 1] - i else: seq[i] = seq[i - 1] + i return seqprint(recaman(10))#結果:#[0, 1, 3, 6, 2, 7, 13, 20, 12, 21]

△ 一般視覺化:

1 matplotlib的靜態視覺化:效果圖如圖1

程式碼:

from matplotlib import patchesimport matplotlib。pyplot as pltfig, ax = plt。subplots(facecolor=‘black’)ax。set_frame_on(False) #是否繪製軸矩形面片ax。get_yaxis()。set_visible(False) # 不顯示ax。get_xaxis()。set_visible(False) # 不顯示# 定義函式:經典8行法def recaman(n): seq=[0]*n for i in range(1, n): if seq[i - 1] - i > 0 and seq[i - 1] - i not in seq: seq[i] = seq[i - 1] - i else: seq[i] = seq[i - 1] + i return seqn = 100#n=int(input(‘請輸入序列個數,推薦100:’))seq = recaman(n)centers = []ds = []start = seq[0]for end in seq[1:]: centers。append((start + end) / 2) ds。append(end - start) start = endfor c, d in zip(centers, ds): arc = patches。Arc((c, 0), d, d, theta1=180, theta2=0, linewidth=0。5,color=‘green’) ax。add_patch(arc)plt。xlim(0 - 10, max(seq) + 10)plt。ylim(-1 * (max(ds) / 2 + 10), max(ds) / 2 + 10)plt。axis(‘equal’)plt。show()

2 turtle視覺化一:效果圖如圖1

import turtleturtle。setup(2000,1200,0,0)turtle。bgcolor(‘black’)turtle。tracer(0) # 不顯示繪畫過程,註釋掉後可以觀看繪畫過程turtle。ht()# 定義函式:經典8行法def recaman(n): seq=[0]*n for i in range(1, n): if seq[i - 1] - i > 0 and seq[i - 1] - i not in seq: seq[i] = seq[i - 1] - i else: seq[i] = seq[i - 1] + i return seqclass RecamanTurtle(turtle。Turtle): def __init__(self,n:int=0): super(RecamanTurtle, self)。__init__() self。alignment = -1 self。start_offset = -self。getscreen()。window_width() / 2 +400 self。pencolor(‘green’) self。penup() self。setx(self。start_offset) self。left(90) self。pendown() def draw(self, pos: int): step = self。xcor() + -self。start_offset - pos self。circle(step / 2, 180 * self。alignment) self。left(180) self。alignment *= -1Draw_recaman_seq = RecamanTurtle(0)Draw_recaman_seq。speed(10)for i in recaman(100): # 序列個數是100 Draw_recaman_seq。draw(i*5) # 推薦5turtle。done()

3 turtle視覺化二:

# -*- coding: utf-8 -*-import turtle as twidth=2000height=1200t。setup(width=width, height=height)t。bgcolor(‘black’)t。tracer(0) # 註釋掉,就可以觀看繪畫過程t。penup()t。setpos(-width/2+400, 0)t。pendown()scale = 5 # 大小,5比較合適 current = 0seq = []for i in range(1, 100): backwards = current - i if backwards > 0 and backwards not in seq: t。pencolor(“green”) t。setheading(90) t。circle(scale * i/2, 180) current = backwards seq。append(current) else: t。pencolor(“pink”) t。setheading(270) t。circle(scale * i/2, 180) current += i seq。append(current)t。done()

效果圖:

整數序列之Recaman

整數序列之Recaman

△ 高階視覺化:pygame

1 程式碼:

# 第1步:模組匯入import pygameimport colorsysfrom pygame。locals import * # 呼叫視窗大小可調節RESIZABLE# 第2步:視窗初始化設定width=1000height=800pygame。init()screen = pygame。display。set_mode((width,height),RESIZABLE)pygame。display。set_caption(‘Space to Start/Stop’) # 視窗標題名# 第3步:函式定義def recaman(seq, curr): next = seq[curr-1] - curr if (next < 0 or next in seq): next = seq[curr-1] + curr seq。append(next) curr += 1 return seq, currdef draw(screen, seq, curr): screen。fill((0,0,0)) Max = max(seq) scaled_seq = [seq[i]*(width/Max) for i in range(len(seq))] for i in range(len(seq)-1): center = (scaled_seq[i]+scaled_seq[i+1])/2 radius = round(abs(center - scaled_seq[i])) color = rainbow(i) # 獲取彩色 pygame。draw。circle(screen, color, (center, 400), radius, 1) #thickness = 1 def rainbow(num): color = colorsys。hsv_to_rgb((num/2)%360。/360。, 1。, 1。) return tuple(round(i*255) for i in color)def draw_screen(screen, seq, curr): font = pygame。font。SysFont(“arial”, 30) text_number = font。render(“Number: ” + str(curr), True, (255,255,255)) text_value = font。render(“Value: ”+ str(seq[-1]), True, (255,255,255)) screen。blit(text_number, (20, 20)) screen。blit(text_value, (20, 50))# 第4步:引數和動畫設定seq = [0]curr = 1 Run = TrueStep = Falsekey = Nonewhile Run: for event in pygame。event。get(): if event。type == pygame。QUIT: # 退出設定 Run = False if event。type == pygame。KEYDOWN: # 啟動和暫停 if event。key == pygame。K_SPACE: Step = not Step # 動畫設定 if Step == True: seq, curr = recaman(seq, curr) draw(screen, seq, curr) pygame。time。delay(50) draw_screen(screen, seq, curr) pygame。display。update()

2 動畫效果:

整數序列之Recaman

整數序列之Recaman

整理並分享出來。

整數序列之Recaman