这个挑战是关于递归的(警察的线程)


15

警察的线

在此线程中,您的任务是制作一个基于递归的程序/函数以生成任何整数序列。强盗将尝试在强盗的线程中找到较短的非递归解决方案。

挑战简介

在许多语言中,递归函数可以大大简化编程任务。但是,适当递归的语法开销可能会限制其在代码高尔夫球中的可用性。

警察将创建一个程序或函数采取一个整数n,这将产生所述第一n整数系列的条目,只使用递归1。他们还应确保以较短的非递归方式生成序列,以将其输入标记为安全。

劫匪将试图找到一个更短的程序或功能相同的语言,产生相同的整数系列,不使用递归2

如果警察在十天之内(240小时)未破解提交的文件,则警察将通过公开自己的解决方案来证明实际上有可能采用较短的非递归方法。然后,他们可以将提交的内容标记为安全

警察挑战赛的获胜者将是最短的(根据)基于递归的标记为安全的提交。

强盗挑战的赢家将是破解最多解决方案的强盗。

1:只需要递归语法即可;您无需担心例如尾部呼叫优化。

2:同样,语法不是递归的;因此,由于尾部调用优化,您无法发布递归解决方案并将其编译为循环。

提交要求

每个提交都将使用一个整数n(从零开始或从一个开始)。然后,提交的内容将输出或返回第一个n整数选择系列项。(请注意,此整数系列不能依赖n)。输入和输出方法在递归和非递归方法之间可能有所不同。整数序列可以是长度至少为5的任何确定性序列。应该对序列进行适当的说明。

您提交的内容不必花大价钱就能工作n,但至少应该能工作n=5。非递归方法必须至少能够n与递归方法相同,或者达到n=2^15-1,以较小者为准。

递归

对于这一挑战的缘故,递归定义为创建使用所期望的序列的功能(或类似函数的构建体),其调用自身(或调用的功能的序列结束调用本身;这包括如Y组合的构建体)。递归深度应达到无穷n大。非递归的方法是什么,是不是递归的。


对于百里香for来说,递归背后是for递归的还是循环的?
l4m2

n如果理论上正确,我是否可以说代码可以任意工作,但由于时间或内存限制而无法运行?
Bubbler

@Bubbler当然可以,但至少n=5必须进行计算
Sanchises

@ l4m2并非所有语言都可以竞争。似乎该语言没有不使用递归的本机方式(除非xfor可以通过某种导入方式使用?),因此该语言可能无法竞争。
桑奇塞斯18-3-7

一个递归,当n变大时,它不会走那么多,这是递归吗?
l4m2'3

Answers:


4

Python 3,65个字节(安全)

f=lambda n,a=3,b=0,c=6,d=6:n*[1]and[a+b]+f(n-1,c,d,2*c+d,2*a+3*b)

在线尝试!

在Python中的另一种尝试。

顺序是“用三种颜色的多米诺骨牌填充2-by-n木板的方式的数目,这样就不会有两个相同颜色的多米诺骨牌互相接触”。不在OEIS上。


比方说n=6。董事会看起来像:

######
######

这些是三种颜色的有效多米诺瓷砖,(分别1-3代表一种颜色):

123123 122331 212332 212121 113311
123123 133221 212112 212121 331133

但是这些不是(两个同色的多米诺骨牌互相接触):

112323 332333 211113
112323 112311 233223

该序列计算满足每个规则的所有可能的Domino切片n


目标解决方案,58个字节

n=int(input());a=3;b=12
for _ in[0]*n:print(a);a,b=b,a*4+b

在线尝试!

不幸的是,似乎没有人愿意简化递归关系,这在递归代码中已清楚显示。因为它是Python 3,所以无法按原样制作具有给定的重复率的程序。


1
您能否详细说明一下顺序。
tsh

@tsh添加了一些解释。看起来好点吗?
Bubbler

2

八度,47字节,由l4m2破解

@(n)(f=@(r,m){@()[r(r,m-1),m],[]}{~m+1}())(f,n)

在线尝试!

例如,这是一个八度条目,该条目生成第一个n正整数https://oeis.org/A000027


破解了。+1可以实现递归匿名功能……经常不使用这些功能:)
Stewie Griffin

@StewieGriffin我绝对喜欢Octave中的高尔夫递归匿名函数,尽管它们从来没有比基于循环的版本短。反过来,这个挑战绝对会是八度中对警察的挑战。
桑奇塞斯18-3-6

@StewieGriffin不能确定聊天中的ping是否有效,但是l4m2击败了您。
桑奇塞斯18-3-6



2

Röda,40个字节

f x,a=1,b=2{[a];f x-1,a=b,b=a+b if[x>1]}

在线尝试!

此函数给出以下有限序列(前90个斐波那契数):

1
2
3
5
8
13
21
34
55
89
144
233
377
610
987
1597
2584
4181
6765
10946
17711
28657
46368
75025
121393
196418
317811
514229
832040
1346269
2178309
3524578
5702887
9227465
14930352
24157817
39088169
63245986
102334155
165580141
267914296
433494437
701408733
1134903170
1836311903
2971215073
4807526976
7778742049
12586269025
20365011074
32951280099
53316291173
86267571272
139583862445
225851433717
365435296162
591286729879
956722026041
1548008755920
2504730781961
4052739537881
6557470319842
10610209857723
17167680177565
27777890035288
44945570212853
72723460248141
117669030460994
190392490709135
308061521170129
498454011879264
806515533049393
1304969544928657
2111485077978050
3416454622906707
5527939700884757
8944394323791464
14472334024676221
23416728348467685
37889062373143906
61305790721611591
99194853094755497
160500643816367088
259695496911122585
420196140727489673
679891637638612258
1100087778366101931
1779979416004714189
2880067194370816120
4660046610375530309

我知道它可以产生更多的斐波那契数,但就此挑战而言,足以生成这些数。


1

JavaScript(Node.js),91字节,被l4m2破解

f=x=>[w=~-x&&(g=(n,y=2)=>~-n&&(n<y?1:n%y?g(n,y+1):1+g(n/y,y)))(x)+f(x-1),console.log(w)][0]

在线尝试!

打印OEIS序列的前n个项 A022559(从i = 1开始)。

l4m2适合将3循环成74 72字节并破解了我的警察职位:

n=>{for(i=s=0;j=i++<n;console.log(s))for(x=i;j++<i;)for(;x%j<1;x/=j)s++}

但是,我预期的答案实际上只有2个for循环:

n=>{for(i=c=0;i++<n;console.log(c))for(p=2,z=i;p<=z;z%p?p++:(z/=p,c++));}

在线尝试!



@ l4m2实际上我有一个73字节的文件;)无论如何
恭喜

继续打高尔夫吧,现在是72 @ user71546
l4m2

1

x86 .COM函数,12字节,由NieDzejkob破解

0000 52                     push dx
0001 4A                     dec dx
0002 7403                   je 0007
0004 E8F9FF                 call 0000
0007 58                     pop ax
0008 F7E0                   mul ax
000A AB                     stosw


000B C3                     ret

输入DX,输出[DI]〜[DI + 2 * DX-1]

饼干的解决方案:

0: 31 C0    xor ax, ax
2: BF 01 00 mov di, 1
5: 01 F8    add ax, di
7: AB       stosw
8: E2 FB    loop 5
A: C3       ret

预期解决方案:

  xor bx,bx
c:inc bx
  mov ax,bx
  mul ax
  stosw
  loop c
  ret


我改变了输出方法。你能看吗?
NieDzejkob

1

Python 3,62 个字节,由mwchase 破解

def f(x):
 if(x<1):return[1]
 return f(x-1)+[sum(f(x-1)[-2:])]

在线尝试!

我觉得这太简单了...

该序列是斐波那契序列,f(n) = f(n-1) + f(n-2)其中f(0) = f(1) = 1


您可以切换到由布尔运算符组成的内联三元语句,将其放入一个语句中,然后可以直接在冒号之后。至少保存八个字节。
mwchase

切换到lambda可以节省两个(编辑:四个)。
mwchase

2
@mwchase非常感谢您的建议,并会在以后提交python代码时牢记这些建议,但出于几个原因,我不会打高尔夫球和强盗。首先,如果我继续打高尔夫球,那么它将为强盗设定一个移动目标,这在这种类型的职位中是不希望的。第二次打高尔夫球意味着我也需要打迭代的高尔夫球,而我可能做不到同样的程度
PunPun1000


1

Gol> <>,15个字节,由mbomb007 破解

I1AZZ;
M:K:?ZNB

在线尝试!

该系列是,0,1,2,3,4,5但是每个元素后跟那么多个0。

例如,前几个值是:

 1: 0  First element, followed by 0 zeroes
 2: 1  Followed by 1 zero
 3: 0
 4: 2  Followed by 2 zeroes
 5: 0
 6: 0
 7: 3  Followed by 3 zeroes
 8: 0
 9: 0
10: 0
    etc.



0

Windows .BAT,80字节

@set /a n=%1-1
@echo 8%3
@if 0 neq %n% @call %0 %n% 2%3 6%2%3

用法:

CD <PATH>
<FILENAME> <N_1>
<FILENAME> <N_2>
<FILENAME> <N_3>

循环版本可以在当前字典中使用,但必须初始化或重置


0

Python,82个字节;破解

这是82字节的OEIS序列A004001的递归Python实现。有关该系列的更多背景信息,请参见Wolfram的Mathworld

def A(n):
 if n in[1,2]:return[1]*n
 S=A(n-1);return S+[S[S[n-2]-1]+S[n-S[n-2]-1]]

此序列中的前30个数字是:

1, 1, 2, 2, 3, 4, 4, 4, 5, 6, 7, 7, 8, 8, 8, 8, 9, 10, 11, 12, 12, 13, 14, 14, 15, 15, 15, 16, 16, 16

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.