Artı-eksi dizisi


26

Artı-eksi dizisi

Artı-eksi dizisi, iki tohumla başlayan bir sayıdır a(0)ve b(0). Bu dizinin her bir yinelemesi, dizinin önceki iki üyesinin eklenmesi ve çıkarılmasıdır. Bu a(N) = a(N-1) + b(N-1)ve b(N) = a(N-1) - b(N-1).

Amaç Artı-eksi dizisini, sonsuzlukta veya verilen ilk Kadımlarda üretin K. Bunu, sonsuz bir çıktı programı, bir jeneratör veya ilk Kadımları veren bir işlev / program kullanarak yapabilirsiniz . Çıktı sırası, tutarlı olduğu sürece farketmez. (Yani, b(K) a(K)ya da a(K) b(K), aralarında, sayısal olmayan olmayan satır ayırıcı ile.) Çıkış girişi ile başlamalıdır.

Test durumları

Girdiler için 10 2( a(0) b(0)bu, ilk K yaklaşımı için olası bir çıktıdır (veya sonsuz yaklaşımın bir alt bölümüdür):

10     2
12     8
20     4
24     16
40     8
48     32
80     16
96     64
160    32
192    128
320    64
384    256
640    128
768    512
1280   256
1536   1024
2560   512
3072   2048
5120   1024
6144   4096
10240  2048
12288  8192
20480  4096
24576  16384
40960  8192
49152  32768
81920  16384
98304  65536

Girişler için 2 20 10( a(0) b(0) k):

2     20
22   -18
4     40
44   -36
8     80
88   -72
16    160
176  -144
32    320
352  -288

Bu bir , yani bayt cinsinden en kısa program kazanır.


Bir (2n) = a (0) · 2ⁿ ve b (2n) = n (0) · 2ⁿ farkettim, ama bu muhtemelen burada işe yaramaz.
Neil

Arasındaki sayısal olmayan ayırıcı Can ave bYeni satır olacak?
Suever

@Suever Hayır, yapamaz.
Conor O'Brien,

@ CᴏɴᴏʀO'Bʀɪᴇɴ Açıklama için teşekkürler!
Suever

1
Bir diziyi döndürmek gayet güzel: @guifa
Conor O'Brien

Yanıtlar:


13

Jöle , 5 bayt

ṄI;Sß

Bu özyinelemeli bir yaklaşımdır. Kuyruk çağrısı optimizasyonu nedeniyle, tek sınır her iki tamsayının da belleğe sığabilmesidir. Çıktı, satır başına bir listedir.

Çevrimiçi deneyin!

Nasıl çalışır

ṄI;Sß  Main link. Argument: [b[n], a[n]] (n = 0 for original input)

Ṅ      Print [b[n], a[n]] to STDOUT.
 I     Compute the increments of the list, i.e., [a[n] - [b[n]].
   S   Compute the sum of the list, i.e., b[n] + a[n].
  ;    Concatenate the results to the left and to the right.
    ß  Recursively call the main link.

Vay. Bu oldukça etkileyici.
Conor O'Brien,

Main linkAslında ne anlama geliyor?
kedi,

4
@ cat C'nin ana işlevi gibi. Her satır farklı bir işlev / bağlantı tanımlar, ancak program çalıştırıldığında sonuncusu otomatik olarak çağrılır.
Dennis,

> Jelly programları 257 farklı Unicode karakterden oluşur. Bir baytta 256 bit yok mu?
thepiercingarrow

@ MarkWright ve satır beslemeleri birbirlerinin yerine kullanılabilir. Her ikisini de UTF-8 modunda kullanabilirsiniz, ancak yalnızca \x7fJelly kod sayfasında göstermeniz gerekir.
Dennis,

5

Python 2,31 bayt

def f(a,b):print a,b;f(a+b,a-b)

Sonsuza dek yazdırır. Sonunda, özyineleme sınırını aştın, ama bu bir sistem sınırlaması.


Özyineleme hatası alınmadan önce bunun ne kadar süre devam edeceğini düşünüyorsunuz?
R. Kap

R.Kap, ~ 1000'dir. Bu sınırı, istediğin şekilde ayarlayabilirsinsys.setrecursionlimit
Mathias711

@ R.Kap Makinemde yaklaşık 10 saniye sürüyor.
xnor

Bir özyineleme hatası oluşturmadan 10 saniye önce? Vay. Python 3'te mayının 30 dakika boyunca devam etmesine izin verdim ve hiçbir hata olmadı. Rakamlardan biri için 2000'den fazla rakam yazabildim! Sanırım bir whiledöngü, yaptığınızdan daha farklı davranıyor.
R. Kap

Bunu bir lambda ile kullanmayı denedim ama daha fazla bayt aldı ( f=lambda a,b:print(a,b)or f(a+b,a-b))
MilkyWay90

5

MATL , 10 bayt

`tDtswPdhT

Bu sürüm artı eksi dizisinde sonsuz sayıda öğe çıktısı verecektir.

Çevrimiçi Deneyin! (sonsuz döngü nedeniyle çalıştırdıktan sonra durdurun)

açıklama

    % Implicitly grab input as a two-element array [a,b]
`   % do...while loop
tD  % Duplicate and display the top of the stack
ts  % Duplicate [a,b] and add them together
w   % Swap the top two elements on the stack
P   % Swap the order of b and a in preparation for diff
d   % Compute the difference between b and a
h   % Horizontally concatenate [a+b, a-b]
T   % Explicit TRUE to make it an infinite loop
    % Implicit end of the do...while loop

Bu otomatik olarak tüm çok büyük sayıları bilimsel gösterime dönüştürür mü?
R. Kap

@ R.Kap Öyle gözüküyor. Asıl sorun beyanında açıkça yasak görünmüyor.
Suever,

Vay, çok güzel. Python'da, çok büyük rakamlara sahipseniz, her seferinde bir rakamı basmaya devam eder, bu yüzden bütün bunlara bakmak biraz sıkıcı olur. Sadece diğer dillerin çoğunun da bunu yaptığını düşündüm, ancak Python bu durumda benzersiz olanı gibi görünüyor.
R. Kap

Öyleyse MATLAB'da (hangi MATL kaputun altında kullanılır), çıktı formatını istediğiniz şekilde değiştirebilirsiniz. MATL'nin varsayılanı bilimsel gösterime geçmeden önce 15 rakam göstermektir.
Suever,

Oops benim kötü, üzgünüm, silinen;)
thepiercingarrow

3

Haskell, 19 bayt

a#b=a:b:(a+b)#(a-b)

Sonsuz sayı dizisi üretir. Kullanım örneği:

Prelude> take 20 $ 2#20

[2,20,22,-18,4,40,44,-36,8,80,88,-72,16,160,176,-144,32,320,352,-288]

3

Pyth, 10 9 bayt

1 bayt için @isaacg 'a teşekkür ederiz.

#=Q,s
Q-F

Sonsuz çift dizisi yazdırır.

$ pyth plusminus.p <<< "[10,2]" | head -n 15
[10, 2]
[12, 8]
[20, 4]
[24, 16]
[40, 8]
[48, 32]
[80, 16]
[96, 64]
[160, 32]
[192, 128]
[320, 64]
[384, 256]
[640, 128]
[768, 512]
[1280, 256]

1
İlk ve son Qs kaldırılabilir - Pyth onları tam olarak dolduracaktır.
isaacg

@isaacg Yani o zaman uygulandı? Güzel. İlki çıkarmayı denedim ama işe yaramadı.
PurkkaKoodari

Bu garip, benim makinede çalışan ilk çıkarmadan.
isaacg,

3

C, 81 bayt

a,b;main(c){for(scanf("%d%d%d",&a,&b,&c);c--;a+=b,b=a-b-b)printf("%d %d\n",a,b);}

3

05AB1E , 7 bayt

İlk-k yöntemini kullanır . Şunlar için giriş yapın:

k
[a, b]

Kod:

FD=OsƂ

Açıklama:

F        # For N in range(0, k).
 D=      # Duplicate top of the stack and print without popping.
   O     # Sum up the array.
    sÆ   # Swap and perform a reduced subtraction.
      ‚  # Pair the top two elements. a, b --> [a, b]

CP-1252 kodlamasını kullanır . Çevrimiçi deneyin!


1
Kod, belli belirsiz bir dil ismini andırıyor ...
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ Hahaha, ikisi de okunamıyor
Adnan

3

k, 12

{(+;-).\:x}\

.

k){(+;-).\:x}\[10;10 2]
10  2
12  8
20  4
24  16
40  8
48  32
80  16
96  64
160 32
192 128
320 64

Şeklinde de çağrılabilir

k)10{(+;-).\:x}\10 2


3

APL, 37 karakter

{⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z}

Olarak kullanılabilir

    {⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z} 10 2
10 2
12 8
20 4
24 16
40 8
48 32
80 16
[...]

veya

      {⍺←3⊃3↑⍵⋄⎕←z←2↑⍵⋄⍺=1:⋄(⍺-1)∇(+/,-/)z} 10 2 6
10 2
12 8
20 4
24 16
40 8
48 32

3

MathGolf , 8 bayt

ô`αp‼+-∟

Çevrimiçi deneyin!

Girdiyi ters sırayla alır, ancak basitçe yığına itilmelerinin nedeni budur. Aksi takdirde 1 bayt daha uzun olacaktır. Çıkıştan 2-3 bayt gelir. Her satırda bir çift basmaya gerek kalmadan program olabilir æ`‼+-∟(diziyi süresiz olarak dizen elemanları ile doldurur) ya da É‼+-∟( -dbayrak aktif olduğu sürece ilk hata ayıklama işlemi hariç dizinin tüm öğelerini yazdırır ) olabilir. .

açıklama

ô      ∟   do-while-true
 `         duplicate the top two items
  αp       wrap last two elements in array and print
    ‼      apply next two operators to the top stack elements
     +     pop a, b : push(a+b)
      -    pop a, b : push(a-b)

Merhaba Max. Ne zamandan beri emin değilim, ancak şu anda TIO'daki MathGolf sürümü artık dize girişini kabul etmiyor. Herhangi bir dize girişi için verilmişse, program için herhangi bir kod olmadan bile ne kullandığım önemli değil. örnek ABC, stdin = StdIn(line)Python kodunda satırında hata alıyorum ..
Kevin Cruijssen

1
@KevinCruijssen Merhaba! Dize girişi 'ABC'veya olarak verilmelidir "ABC". Dahili ast.literal_evalolarak girişi ayrıştırmak için kullanılır. Orada gidermesinden gereken bazı tuhaflıklar hala, ancak bunu mümkün olmalıdır bu .
maxb

Ah tamam, bu mantıklı. BT, bir dizgiyi / sayıyı belirli büyüklükteki parçalara veya bir miktar eşit boyutlu parçalara bölmek için bir yapıya sahip midir? Yani ABCDEFhiç [AB, CD, EF]?
Kevin Cruijssen

Nvm, görünüşe göre yok, ama bunu yapmanın bir yolunu bulabildim: 2ô_2<\1>](girdi uzunluğu 6'ya kodlanmış ve boyut 2'ye ayrılmıştır, çünkü ihtiyacım olan buydu, ama muhtemelen olmalıydı) Genel giriş boyutları ve parça boyutları için çalışmak üzere değiştirilebilir).
Kevin Cruijssen

1
/n

2

Python 3.5, 55 43 bayt:

def q(a,b):
 while 1:print(a,b);a,b=a+b,a-b

Sonsuza dek görünüşte doğru sırayı yazdırır. Herhangi bir hata yapılmadan yaklaşık 30 dakika devam etmesine izin verdim ve program ilk numara için 2301 rakam, ikincisi için 1150 rakam yazdırdı! Buna dayanarak, çalışmak için yeterli donanımın sağlanmasının, bu WAY için daha uzun süre devam edip WAY daha fazla rakam yazdırabileceğini ve teorik olarak tekrarlama limitinin olmadığını, whiledöngünün nezaketine sahip olduğunu tahmin ediyorum !


Sanırım mevcut değerleri, döngünün başında yazdırmanız gerekiyor, böylece ilk çıktı girdiyle aynı olacak. Ayrıca, bu kod golf olduğu için parantezleri ve ara değişkenleri en iyi duruma getirmelisiniz. Son olarak, bir stil nit olarak, değişkenleri adlandırmayı ave bsoruyu eşleştirmeyi düşünmelisiniz .
Neil,

@Neil İpuçları için teşekkürler. :)
R. Kap

Kafam karıştı; whileşimdi hem bir hem de özyinelemeli bir görüşme yaptınız ...
Neil

@Neil Evet, bunu farketmedim. Şimdi, sabit ve bir süre döngüde, teorik olarak sınırsız.
R. Kap,

2

Reng v.3.2, 9 bayt (kendi kendine cevap veren, rekabet etmeyen)

ii¤ææö±2.

İki giriş alır ( a b) ve çıkışlar b a. Burada dene!

igirişi iki kez alır ¤, yığını çoğaltır, æsayı ve boşluk yazdırır (ve iki kez yapar, iki tane olur), öyeni bir satır yazdırır, ±beklediğiniz şeyi yapar 2.ve giriş karakterlerini saran sonraki iki karakteri atlar.


2
Hiyerogliflerin her birinin benim gibi bir başkasına ne yaptığını açıklar mısın? :)
Kevin Cruijssen

@KevinCruijssen Gizemi açıkladım. :)
Conor O'Brien,

2

Python 2.7, 56 , 42 bayt:

a,b=input()
while 1:print a,b;a,b=a+b,a-b

Sonsuza kadar basabilen basit döngü (ish).


Bayt kaydetmek için girinti düzeyi için tek bir boşluk kullanabilirsiniz. Ayrıca, yalnızca birini veya diğerini iki yöntemle yapmanız gerekmez, böylece varsayılan parametreyi kaldırabilirsiniz.
Conor O'Brien,

Lanet olası not defterimin 4 boşlukta sekme oluşturduğunu fark etmedim ve kesinlikle bir şeyi sınırlandıracağım, teşekkürler.
Serdalis

Bunu ilk satırı değiştirerek bir program a,b=input()yaparsanız, girintiyi kaldırabilirsiniz.
xnor

@xnor Teşekkürler, sadece 1 byte tasarruf eder, ancak artık çirkin değildir!
Serdalis

2

Toplu, 54 bayt

@echo %1 %2
@set/aa=%1+%2
@set/ab=%1-%2
@%0 %a% %b%

CMD.EXE'nin 32-bit işaretli tamsayılarla sınırlı olduğunu unutmayın, bu yüzden hızlı bir şekilde taşar ve çöp ve hata iletilerini yazdırır.


1
Her zaman burada bir toplu cevap görmeyi seviyorum! : D
Conor O'Brien

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Özellikle sizin için yazdım.
Neil

2

Julia, 25 bayt

a<|b=[a b]|>show<a+b<|a-b

En fazla sözdizimi istismarı. Julia çok garip .Çevrimiçi deneyin!

Alternatif sürüm, 29 bayt

<|Bir BigInt çağırmazsanız, çıkışın sonunda taşacağına dikkat edin . Ne yazık ki, bu durumda showher bir diziyi ön ekleyeceğiz BigInt. Dört bayt pahasına tüm sayısal türler için boşlukla ayrılmış çıktı üretebiliriz.

a<|b="$a $b
"|>print<a+b<|a-b

Çevrimiçi deneyin!

Nasıl çalışır

İkili operatörü <|amaç dışı olarak tanımlarız . Julia'nın son sürümlerinde tanımlanmamıştır, ancak hala çözümleyici tarafından bir operatör olarak tanınır. İken \(açıkça tamsayılar için tanımlanmadı) bir byte kısadır, yüksek öncelik değiştirerek gerektirecektir a+b<|a-bile (a+b)\(a-b)(3 bayt) veya\(a+b,a-b) (2 byte).

Ne zaman a<|byürütüldüğünde, bu arayarak başlar showyazdırmak için [ab] STDOUT. Sonra a+b<|a-btekrarlı <|olarak toplamı veya farkı çağırır .

Özyinelemenin (olması gerekiyordu) sonsuz olduğu için karşılaştırma <asla yapılmaz; tek amacı kodun iki bölümünü zincirlemektir. Bu, daha basit bir alternatif üzerinde iki bayttan tasarruf sağlar ([a b]|>show;a+b<|a-b).


2

Perl 6 , 23 bayt (sonsuz)

Düzenleme: JoKing sayesinde, sıra sürümü şimdi en kısa (aynı zamanda OP'den .sayaçıklama başına kaldırıldı) :

{@_,{.sum,[-] |$_}...*}

TIO: InfiniteSeq

Eski işlevsel cevap

->\a,\b {(a,b).say;f(a+b,a -b)}

TIO: InfiniteFunc

Perl 6'nın özyinelemeli bir tekrarlama sınırı olmadığına, sadece mevcut hafızaya dayandığına dikkat edin, bu yüzden bombalamadan önce milyonlara ulaşacak.


Sonsuz için 23 bayt
Jo King

@Joking: Güzel! .Sum'u düşünmediğim için kendimi aptal hissediyorum. Sanırım gereksinimler işlevde ortaya çıkmayı zorunlu kılıyor (açıklama için sordum, ancak diğerlerinin çoğu bunun tio.run/##K0gtyjH7n1upoJamYPu/… ile verdiği gibi ) görünüyor
user0721090601

1

Faktör, 62 bayt

:: f ( a b -- x ) a b "%s %s" printf a b + a b - f ; recursive

recursive, ya da başka bir çağrı atama çok hızlı bir şekilde bitiyor.


1

Yakut, 25 bayt

Dayanarak XNOR Python çözümü . Belki başka yanıtında bir jeneratör yapacağız, ancak bu yazdırılacaktır asonra b, ardından yeni a, daha sonra yeni bsonsuza.

f=->a,b{p a,b;f[a+b,a-b]}

1

Python 3, 42 bayt

Bu fonksiyon için bir jeneratör yazmak istedim ve yaptım.

def f(a,b):
 while 1:yield a,b;a,b=a+b,a-b

Python 3'te, sıra bu şekilde üretilir:

>>> gen = f(2, 20)
>>> next(gen)
(2, 20)
>>> next(gen)
(22, -18)
>>> next(gen)
(4, 40)
>>> next(gen)
(44, -36)
>>> next(gen)
(8, 80)

1

Ortak Lisp, 57

(lambda(a b)(loop(print`(,a,b))(psetf a(+ a b)b(- a b))))

psetfParalel değişkenlere değerleri etkileyen kullanımlar ve basit loopsözdizimi.


1

bash + GNU coreutils, 75 bayt

a=$1
b=$2
for i in `seq $3`;{ echo -e "$a\t$b";c=$a;a=$((c+b));b=$((c-b));}

çağırma:

./codegolf.sh 2 10 5

1

CP / M 8080, 47 bayt

z80 anımsatıcıları ama 8080'in sahip olmadığı bir şey yok, kaynak bir kez girdi yerine çıktıyı saymaya karar verdim ama ters fonksiyon isimleri korundu, elle toplandı, böylece xx'lerin bayt sayısını bildiğim ama işlememediğim için affet çıkış adresleri veya ofsetleri:

# setup
ld c, 2     0e 02

# loop
.s

# update H (temporarily in B)
ld a, h     7c
add l       85
daa         27
ld b, a     46

# update L
ld a, h     7c
sub l       95
daa         27
ld l, a     6f

# copy B back to H, output H
ld h, b     60
call +o     cd xx xx

# output L
ld b, l     45
call +o     cd xx xx

# repeat
jr -s       18 xx

# output a two-digit BCD value followed by a space
.o

# output high digit
ld a, b     78
rra         1f
rra         1f
rra         1f
rra         1f
call +ob    cd xx xx

# output low digit
ld a, b     78
call +ob    cd xx xx

# output a space
ld e, #$20  1e 20
call 5      cd 00 05

# return
ret         c9

# output a single BCD digit
.ob
and #$f     e6 0f
add #$30    c6 30
ld e, a     5f
call 5      cd 00 05
ret         c9

1

Clojure, 44 bayt

#(iterate(fn[[a b]][(+ a b)(- a b)])[%1 %2])

Sonsuz bir tembel sekans üreten fonksiyon.


1

Perl 5, 40 bayt

gerektirir -E(ücretsiz)

sub a{say"@_";($c,$d)=@_;a($c+$d,$c-$d)}

veya (aynı uzunluk)

$_=<>;{say;/ /;$_=$`+$'.$".($`-$');redo}

(İkincisi çarptım, çünkü bazı yinelemeler için yuvarlama hataları olmalı.)

Şapka ucu.

Ancak daha kısa bir Perl 5 çözümü olması gerektiğinden şüpheleniyorum.


1
Daha kısa bir çözüm varsa, Ton Hospel bulacaktır. : P
Conor O'Brien

Bir süre aldı, ama daha kısa bir yolunu
Xcali

1

DÖNÜŞ , 21 bayt

[¤.' ,$.'
,¤¤+2ª-F]=F

Try it here.

Özyinelemeli operatör-lambda. Kullanımı:

[¤.' ,$.'
,¤¤+2ª-F]=F10 2F

açıklama

[                 ]=F  declare function F for recursion
 ¤.' ,$.'␊,            output top 2 stack items along with trailing newline
           ¤¤+2ª-      get plus and minus of top 2 stack items
                 F     recurse!

1

> <> , 26 bayt

:?!;1-r:n48*o:@@:nao:@+}-$

İle ara a, b, nyığında, burada ndönüş sayısı ya da sonsuz çıkış için negatif bir değerdir. Çıktı ave bbir boşlukla ayrılmış.

Bir açıklama olarak, çalışma zamanı sırasında yığının nasıl geliştiği:

abn
nba
nbaa
naab
naabb
nabab
nab+
+nab
+n-
+-n

Çevrimiçi tercüman üzerinde pozitif turlarla deneyebilirsiniz , ancak sonsuz modu test etmek için resmi python tercümanı kullanmanız gerekir.

$ python fish.py -c ':?!;1-r:n48*o:@@:nao:@+}-$' -t 0.01 -v 10 2 -1
10 2
12 8
20 4
24 16
40 8
48 32
80 16
96 64
160 32
192 128
320 64
384 256
640 128
768 512
1280 256
1536 1024
2560 512
3072 2048
5120 1024
6144 4096
10240 2048
12288 8192
20480 4096
24576 16384
40960 8192
49152 32768
81920 16384
98304 65536
163840 32768
196608 131072
327680 65536
393216 262144
655360 131072
786432 524288
1310720 262144
[...]

1

Bulanık Octo Guacamole , 17 16 bayt

(rekabet etmeyen, mücadeleden sonraki özellikleri kullanır)

^^(:C.Zs.aZ.s.-)

Müşteri tarafında yapılan hatalar nedeniyle bunu yapmak zordu. Ama anladım!

İzlenecek yol:

^^                # Get input twice, pushes it to the stack.
  (               # Start a infinite loop.
   :              # Prints the stack, and since it has [a,b] is just the output.
    C             # Copy the active stack to the inactive stack.
     .            # Shift the active stack.
      Z           # Reverse the stack.
       s          # Move the top item on the active stack to the top of the inactive.
        .         # Switch stacks again.
         a        # Add the top 2 items, giving the first new item.
          Z       # Reverse the stack, so we keep the 'a' safe and prepare for the 'b'.
           .      # Switch stacks.
            s     # Move the top item on the active stack to the top of the inactive stack.
             .    # Switch stacks.
              -   # Minus the top 2 items, giving 'b'.
               )  # End infinite loop.

FOG'u o kadar iyi tanımıyorum, ancak :döngünün başlangıcına gidip iki kez yazdırma gereksinimini ortadan kaldıramaz mısınız?
Conor O'Brien, 15

oooooh @ CᴏɴᴏʀO'Bʀɪᴇɴ teşekkürler.
Rɪᴋᴇʀ

Açıklamayı güncellemeyi unutma;)
Conor O'Brien

@ CᴏɴᴏʀO'Bʀɪᴇɴ ne demek istediniz? : P
Rɪᴋᴇʀ

1

Cidden, 12 bayt

,,1WX■@│+)-1

Sonsuz bir akış çıkarır, format, b(n) a(n)satır başına bir çıkış çıkışıdır.

Çevrimiçi bağlantı yok, çünkü TryItOnline sonsuz döngülerle iyi iş çıkarmaz.

Açıklama:

,,1WX■@│+)-1
,,1           push a(0), push b(0), push 1
   W          while loop:
    X           discard the 1 (only used to make sure the while loop always runs)
     ■          print all stack elements, separated by spaces, without popping
      @│        swap, duplicate entire stack
        +)      push a(n) + b(n) (a(n+1)) and move it to the bottom of the stack
          -     push a(n) - b(n) (b(n+1))
           1    push 1 to make sure the loop continues

1

J, 16 12 bayt

0&(]+/,-/)~<

Verilen tohumlara dayalı sekans için sadece ilk k değerlerini üretir .

Bu yorumda @randomra tarafından gösterilen numarası (veya sözdizimsel şeker) kullanarak 4 bayt kurtarıldı .

kullanım

   f =: 0&(]+/,-/)~<
   2 20 f 10
  2   20
 22  _18
  4   40
 44  _36
  8   80
 88  _72
 16  160
176 _144
 32  320
352 _288

1

C #, 50 bayt

f=(a,b)=>{Console.WriteLine(a+" "+b);f(a+b,a-b);};

Test durumu da dahil olmak üzere tam kaynak:

using System;
using System.Numerics;

namespace PlusMinusSequence
{
    class Program
    {
        static void Main(string[] args)
        {
            Action<BigInteger,BigInteger>f=null;
            f=(a,b)=>{Console.WriteLine(a+" "+b);f(a+b,a-b);};
            BigInteger x=10, y=2;
            f(x,y);
        }
    }
}

BigInteger veri türü, sayılar taşmadığından ve 0 olmadığından kullanılır. Bununla birlikte, özyinelemeli bir çözüm olduğundan yığın taşması beklenir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.