Czy ta liczba jest liczbą całkowitą -2?

41

sprytne sposoby określania, czy liczba jest potęgą 2. To już nie jest interesujący problem, więc ustalmy, czy dana liczba całkowita jest potęgą liczby całkowitej -2 . Na przykład:

-2 => yes: (-2)¹
-1 => no
0 => no
1 => yes: (-2)⁰
2 => no
3 => no
4 => yes: (-2)²

Zasady

  • Możesz napisać program lub funkcję i użyć dowolnej ze standardowych metod odbierania danych wejściowych i dostarczania danych wyjściowych.

  • Dane wejściowe są jedną liczbą całkowitą, a wartość wyjściowa musi być zgodna z prawdą, jeśli liczba całkowita jest potęgą całkowitą -2, a w przeciwnym razie wartością falsy. Żadne inne dane wyjściowe (np. Komunikaty ostrzegawcze) są niedozwolone.

  • Obowiązują zwykłe reguły przepełnienia liczb całkowitych: twoje rozwiązanie musi być w stanie pracować dla dowolnie dużych liczb całkowitych w hipotetycznej (lub być może rzeczywistej) wersji twojego języka, w której wszystkie liczby całkowite są domyślnie nieograniczone, ale jeśli twój program zawiedzie w praktyce z powodu implementacji brak obsługi liczb całkowitych tak dużych, co nie unieważnia rozwiązania.

  • Możesz używać dowolnego języka programowania , ale pamiętaj, że te luki są domyślnie zabronione.

Warunki wygranej

To jest konkurs : odpowiedź, która ma najmniej bajtów (w wybranym przez ciebie kodowaniu), jest zwycięzcą.

Toby Speight
źródło
17
@KritixiLithos Nie rozumiem, dlaczego tak powinno być. Nie ma itakiej liczby całkowitej , że(-2)^i = 2
Fatalize
2
Czy wykładniki są dodatnie lub -0.5powinny być prawidłowe, ponieważ wynosi 2 ^ (- 1) .
Pan Xcoder,
1
@ Mr.Xcoder, Ponieważ dane wejściowe są zawsze liczbami całkowitymi , wykładnik ujemny nie będzie wymagany (ani możliwy).
Toby Speight
1
@SIGSEGV może, ale inie jest naturalne
Pan Xcoder
2
@Jason, tyle ile obsługiwane / naturalne w Twoim języku - patrz trzecia zasada. I to jest golf golfowy, ponieważ wymaga obiektywnego kryterium wygranej, aby być tutaj na temat - „przyjemne rozwiązanie” nie ucina go (chociaż podoba mi się odpowiedź Mathematica - to mnie zaskoczyło).
Toby Speight

Odpowiedzi:

26

Mathematica, 22 bajty

EvenQ@Log2@Max[#,-2#]&

Wypróbuj online! (Zamiast tego używa matematyki, gdzie to rozwiązanie również działa).

Przez jakiś czas próbowałem znaleźć rozwiązanie z operatorami bitowymi i chociaż jeden z nich zdecydowanie istnieje, znalazłem coś, co prawdopodobnie jest prostsze:

  • Max[#,-2#]mnoży wejście przez -2, jeśli jest ujemne. Mnożenie przez inny współczynnik -2 nie zmienia, czy wartość jest potęgą -2, czy nie. Ale teraz wszystkie nieparzyste potęgi -2 zostały zamienione na parzyste potęgi -2 .
  • Ale nawet potęgi -2 są również parzyste potęgi 2 , więc możemy użyć prostej Log2@...i sprawdzić, czy wynikiem jest liczba całkowita (aby sprawdzić, czy jest to potęga 2 ). To już oszczędza dwa bajty Log[4,...](inny sposób patrzenia na parzyste potęgi -2 ).
  • Dodatkową zaletą jest to, że sprawdzenie, czy wartość jest parzystą liczbą całkowitą, jest krótsze niż samo sprawdzenie, czy jest ona liczbą całkowitą: możemy zaoszczędzić jeszcze trzy bajty, używając EvenQzamiast IntegerQ.
Martin Ender
źródło
Czy pomaga uznać, że nawet potęgi -2 są potęgami całkowitymi 4? Podoba mi się pomysł pomnożenia przez -2, aby wszystko było pozytywne - choć jestem rozczarowany, że do tej pory nie kręciło mi się trochę.
Toby Speight
5
@TobySpeight Traktowanie ich jako potęgi 2 faktycznie oszczędza 5 bajtów. Na początku użyłem mocy 4, ale Log[4,...]jest on dłuższy Log2@...i IntegerQdłuższy niż EvenQ.
Martin Ender,
16

Galaretka , 5 bajtów

æḟ-2=

Wypróbuj online!

Jak to działa

æḟ-2=  Main link. Argument: n

æḟ-2   Round n towards 0 to the nearest power of -2.
    =  Test if the result is equal to n.
Dennis
źródło
12

Python , 46 bajtów

-2 bajty dzięki @ovs.

def g(x):
 while x%-2==0!=x:x/=-2
 return x==1

Funkcja z użyciem:

g(4) # put your number between the brackets

Wypróbuj online!

Pan Xcoder
źródło
print g(8)odbitkiFalse
Felipe Nardi Batista
2
@FelipeNardiBatista, prawda?
Pan Xcoder,
2
przepraszam, mój przykład był zły, print g(4)robi to samo
Felipe Nardi Batista
Poczekaj, jest mały błąd, który naprawiam wkrótce
Mr. Xcoder
1
Umieściłem ;zamiast nowej linii ... przepraszam za to. Naprawiono @FelipeNardiBatista
Mr. Xcoder
11

Galaretka , 6 bajtów

b-2S⁼1

Wypróbuj online!

Jest to oparte na tym, jak Jelly przekształca liczbę całkowitą N na dowolną dowolną zasadę B , robiąc to przez konwersję N na tablicę, w której każda liczba całkowita jest cyfrą d ( N ) B , która może mieć wartość 0 ≤ V d < B . Tutaj będziemy cyfry 0 indeksy z prawej strony, więc każda cyfra dodaje V d B d tworząc N . V d < BV d B d < BB d = B d +1 , dlatego wszystkie możliweN posiada tylko jedną unikalną reprezentacji jeśli pominiemy prowadzące 0s w ( n ) B .

Tutaj d = wejście, B = -2. N = B d = 1 B d = V d B d ⇔1 = V dV d = 1, a ponieważ nie dodajemy żadnych innych wielokrotności mocy B , każde inne V będzie wynosić 0. W tej chwili, tablica powinna być 1 połączona z d 0. Ponieważ Jelly 1-indeksuje od lewej, powinniśmy sprawdzić, czy pierwszy element tablicy ma wartość 1, a wszystkie pozostałe elementy mają wartość 0.

Hmm ... wszystko dobrze, prawda? Nie? Co się dzieje? O tak, mam lepszy pomysł! Najpierw weźmy sumę wszystkich liczb całkowitych w tablicy, traktując ją tak, jakby była tablicą liczb całkowitych, a nie liczbą w bazie -2. Jeśli jest 1, oznacza to, że istnieje tylko jeden 1, a wszystkie inne są całkowitymi 0. Ponieważ nie mogą być zerami, z wyjątkiem przypadku 0 -2(gdzie i tak suma wynosiłaby 0 ≠ 1), 1. liczba całkowita musi być niezerowa. Jedyną niezerową liczbą całkowitą w tablicy jest 1, więc musi być pierwszą. Dlatego jest to jedyny przypadek, w którym suma wszystkich liczb całkowitych w tablicy wynosi 1, ponieważ najmniejsza możliwa suma dodatnich liczb całkowitych wynosi is {1,1} = 2, ponieważ najmniejsza dodatnia liczba całkowita wynosi 1 Każda liczba całkowita w reprezentacji podstawowej jest nieujemna, więc jedynym sposobem, w jaki suma jest 1, ma tylko jeden 1, a wszystkie inne liczby całkowite wynoszą 0. Dlatego możemy po prostu sprawdzić, czy suma wszystkich liczb całkowitych w tablica to 1.

Oto, co robi kod:

b-2S⁼1 Main link. Arguments: d
b-2    Convert d to base -2.
   S   Take the sum.
    ⁼1 Check if the sum is equal to 1.
Erik the Outgolfer
źródło
1
Uff, wyjaśnienie to zajęło trochę czasu ...
Erik the Outgolfer
Nienawidzę patrzeć, jak wtedy wyglądałoby wytłumaczenie długiego programu ...
boboquack
1
@ Boboquack Wyjaśniam, dlaczego używam podstawowych rzeczy do konwersji. Nie sądzę, że wyjaśnienie długich programów byłoby tak długie. Post może zawierać do 30000 znaków przeceny, a wyjaśnienia dla dłuższych programów i tak byłyby bardziej zwięzłe. Przeczytałem też znacznie dłuższe wyjaśnienia i nie są one tak nudne.
Erik the Outgolfer
11

Python 2 , 98 50 bajtów

lambda x:x*(x&-x==abs(x))*((x<0)^x.bit_length()&1)

Wypróbuj online!

Felipe Nardi Batista
źródło
10

Excel, 40 36 bajtów

Zapisane 4 bajty przez CallumDA

Excel z pewnością może to zrobić, ale poprawianie błędów dodaje 11 bajtów

=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1

Dane wejściowe są w komórce A1. Dane wyjściowe to TRUElubFALSE

Gdyby dozwolone było zwrócenie jednego FALSElub #NUM!błędu dla fałszywych wartości, byłoby to tylko 25 bajtów:

=-2^IMREAL(IMLOG2(A1))=A1
Inżynier Toast
źródło
Oto niewielka poprawa:=IFERROR(-2^IMREAL(IMLOG2(A1)),1)=A1
CallumDA
1
@CallumDA Dzięki! Próbowałem wymyślić sposób użycia funkcji liczb zespolonych, ale wszystko, co wymyśliłem, było dłuższe.
Inżynier Toast
9

05AB1E , 8 bajtów

Y(IÄÝm¹å

Wypróbuj online! lub jako pakiet testowy

Wyjaśnienie

Y(         # push -2
  IÄÝ      # push range [0 ... abs(input)]
     m     # element-wise power
      ¹å   # check if input is in the resulting list
Emigna
źródło
Dlaczego głosowanie negatywne?
Kritixi Lithos
@KritixiLithos: Wygląda na to, że ktoś nie ocenił wszystkich języków golfowych.
Emigna
6
Zauważyłem to również. Chociaż nie byłem długo w PPCG, dowiedziałem się, że kreatywne i interesujące rozwiązania w standardowych językach są o wiele bardziej doceniane niż rozwiązania 3-bajtowe w językach golfowych. Są jednak ludzie, którzy (niestety) głosują za bardzo kreatywnymi rozwiązaniami w językach golfowych, po prostu dlatego, że myślą, że wszystko jest wbudowane, i nie rozumieją, jak dobre są algorytmy (choć napisane w golfowych językach). +1 za niewiarygodne rozwiązanie @Emigna
Mr. Xcoder,
ÄLY(småOza 8. Y(sÄLm¢Zza 8… Nieważne, wszystkie 8.
Magiczna ośmiornica Urn
9

JavaScript (ES6), 37 28 24 bajtów

f=x=>!x|x%2?x==1:f(x/-2)

Zaoszczędź 4 bajty dzięki Arnauldowi.

f=x=>!x|x%2?x==1:f(x/-2)

console.log(f(-2));
console.log(f(-1));
console.log(f(0));
console.log(f(1));
console.log(f(2));
console.log(f(3));
console.log(f(4));

Tomek
źródło
Dlaczego widzę błędy (przed wartościami prawda / fałsz) po kliknięciu „Uruchom fragment kodu”?
numbermaniac
@numbermaniac Nie jestem pewien, może używasz przeglądarki, która nie w pełni obsługuje ES6?
Tom
Welp, odświeżony i spróbował ponownie, bez błędów. Nie jestem pewien, co się stało za pierwszym razem.
numbermaniac
8

MATL , 9 8 bajtów

2_y|:q^m

Wypróbuj online! Lub sprawdź wszystkie przypadki testowe .

Jak to działa

Rozważ dane wejściowe -8jako przykład

2_    % Push -2
      % STACK: -2
y     % Implicit input. Duplicate from below
      % STACK: -8, -2, -8
|     % Absolute value
      % STACK: -8, -2, 8
:     % Range
      % STACK: -8, -2, [1 2 3 4 5 6 7 8]
q     % Subtract 1, element-wise
      % STACK: -8, -2, [0 1 2 3 4 5 6 7]
^     % Power, element-wise
      % STACK: -8, [1 -2 4 -8 16 -32 64 -128]
m     % Ismember. Implicit display
      % STACK: 1
Luis Mendo
źródło
Jeśli dobrze rozumiem twoje wyjaśnienie, to podając dane wejściowe n, tworzy to tablicę rozmiarów njako krok pośredni. Dobra robota, że ​​wydajność nie jest tutaj kryterium!
Toby Speight
2
@Toby Oczywiście! To jest golf golfowy, kogo obchodzi wydajność? :-D
Luis Mendo,
6

Oktawa , 28 bajtów

@(n)any((-2).^(0:abs(n))==n)

Definiuje to anonimową funkcję. Podejście jest podobne do tego w mojej odpowiedzi MATL.

Wypróbuj online!

Luis Mendo
źródło
6

PHP, 41 bajtów

for(;$argn%-2==0;)$argn/=-2;echo$argn==1;

PHP, 52 bajty

echo($l=log(abs($argn),2))==($i=$l^0)&&$argn>0^$i%2;

PHP, 64 bajty

Praca z regexem

echo preg_match("#^".($argn>0?1:"1+0")."(00)*$#",decbin($argn));
Jörg Hülsermann
źródło
5

Python 3, 34 bajty

lambda n:n==(-2)**~-n.bit_length()
orlp
źródło
5

JavaScript (ES6), 21 bajtów

Funkcja rekurencyjna, która zwraca 0lub true.

f=n=>n==1||n&&f(n/-2)

Jak to działa

Nie obejmuje to żadnego wyraźnego testu - takiego jak nbycie nieparzystym lub abs(n)bycie mniejszym niż jeden - w celu wczesnego zatrzymania rekurencji, gdy dane wejściowe nie są dokładną siłą -2.

Mamy wyjść tylko wtedy, gdy njest dokładnie równy albo 1albo 0.

Działa to jednak, ponieważ dowolna liczba zmiennoprzecinkowa IEEE-754 zostanie ostatecznie zaokrąglona, 0gdy zostanie podzielona przez 2 (lub -2) wystarczającą liczbę razy, z powodu niedomiaru arytmetycznego .

Przypadki testowe

Arnauld
źródło
4

Java 7, 55 bajtów

boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

Wyjaśnienie:

boolean c(int n){  // Method with integer parameter and boolean return-type
  return n==0 ?    //  If n is zero:
    0>1//false     //   Return false
   : n%-2==0 ?     //  Else-if n mod -2 is zero:
    c(n/-2)        //   Recursive call for the input divided by -2
   :               //  Else:
    n==1;          //   Return if n is one
}                  // End of method

Kod testowy:

Wypróbuj tutaj.

class M{
  static boolean c(int n){return n==0?0>1:n%-2==0?c(n/-2):n==1;}

  public static void main(String[] a){
    for(int i = -2; i <= 4; i++){
      System.out.println(i + ": " + c(i));
    }
  }
}

Wynik:

-2: true
-1: false
0: false
1: true
2: false
3: false
4: true
Kevin Cruijssen
źródło
Non-rekurencyjny sposób jest krótszy o 5 bajtów: boolean c(int n){while(0==n%-2)n/=-2;return 1==n;}.
Olivier Grégoire,
@ OlivierGrégoire Niestety nie działa n=0w Javie, ponieważ 0%-2==0będzie truei 0/-2nadal 0powoduje nieskończoną pętlę, dlatego dodałem tę n==0?0>1część do mojej metody rekurencyjnej.
Kevin Cruijssen
Ładnie zauważony!
Olivier Grégoire,
4

Haskell, 24 23 bajty

f 0=0
f 1=1
f n=f(-n/2)

Definiuje funkcję, fktóra zwraca 1dla potęg -2 lub 0innych.

Golfowa wersja mojego pierwszego poddania się drugiemu wyzwaniu .

Oportunista
źródło
3

JavaScript (ES7), 45 bajtów

x=>-1**Math.log2(Math.abs(x))*Math.abs(x)==x
Matthew Roh
źródło
Math.abs (x) jest dłuższy niż x> 0? X: -x, 11 bajtów do 8 bajtów. Powinieneś także być w stanie zrobić -2 ** ... zamiast -1 ... aby usunąć drugi Math.abs (x)
fəˈnɛtɪk
Co jest w tym specyficzne dla ES7?
Arjun
@ DobbyTheFree-Elf, **jest.
Qwertiy
3

Perl 6 , 21 bajtów

{$_==(-2)**(.lsb//0)}

Spróbuj

Rozszerzony:

{  # bare block lambda with implicit parameter 「$_」

  $_                  # is the input
  ==                  # equal to
  (-2)**( .lsb // 0 ) # -2 to the power of the least significant bit of the input
}

Zauważ, że 0.lsbzwraca, Nilktóra generuje ostrzeżenie, gdy jest używana jako liczba, więc //używany jest zdefiniowany lub operator  .
(Pomyśl, //jak ||z innym skosów)

Wywołanie metody bez wywołującego, w którym spodziewany jest termin, jest domyślnie wywoływane $_. ( .lsb)

Działa również z.msb .

Brad Gilbert b2gills
źródło
Podoba mi się ten!
tale852150,
3

Python , 24 bajty

lambda n:n*n&n*n-1<n%3%2

Wypróbuj online!

Bitowa sztuczka k&k-1==0sprawdza, czy kjest potęgą 2 (lub k==0). Sprawdzanie tego k=n*njako n*n&n*n-1==0mówi nam, czy abs(n)jest potęgą 2.

Aby dalej sprawdzić, czy njest potęgą -2, musimy tylko to sprawdzić n%3==1. Działa to, ponieważ mod 3, wartość -2 jest równa 1, więc jego moc wynosi 1. Natomiast ich negacje to 2 mod 3, i oczywiście 0 daje 0 mod 3.

Łączymy czeki n*n&n*n-1==0i n%3==1w jedno wyrażenie. Pierwszy można napisać <1dla ==0, ponieważ nigdy nie jest on negatywny. Jest n%3==1to równoważne z n%3%2podaniem 0 lub 1. Możemy więc połączyć je jako n*n&n*n-1<n%3%2.

xnor
źródło
2

R, 22 bajty

Pobiera dane wejściowe ze standardowego wejścia, zwraca TRUElub FALSEodpowiednio.

scan()%in%(-2)^(0:1e4)

Nie jestem w 100% pewien, że jest to prawidłowa odpowiedź, ponieważ działa tylko dla liczb całkowitych do limitu rozmiaru R, a jeśli liczby całkowite byłyby nieograniczone, nie działałoby. Jednak zasady stanowią:

Obowiązują zwykłe reguły przepełnienia liczb całkowitych: twoje rozwiązanie musi być w stanie pracować dla dowolnie dużych liczb całkowitych w hipotetycznej (lub być może rzeczywistej) wersji twojego języka, w której wszystkie liczby całkowite są domyślnie nieograniczone, ale jeśli twój program zawiedzie w praktyce z powodu implementacji brak obsługi liczb całkowitych tak dużych, co nie unieważnia rozwiązania.

W hipotetycznym wersji R, która ma umożliwić nieograniczone całkowitymi, to możemy użyć następującego kodu dla tej samej liczby bajtów:

scan()%in%(-2)^(0:Inf)

Oczywiście w prawdziwym R powyższy kod po prostu daje Error in 0:Inf : result would be too long a vector.

rturnbull
źródło
2

bc 88 bajtów

bc -l <<< "n=$1;q=l(sqrt(n*n));p=4*a(1);((n<1)*c(q/l(2)*p/2)+(n>1)*(s(q/l(4)*p)))^2==0"

Mam to w pliku neg2.shi drukuje 1dla potęgi -2i 0innych

Wiem, że to naprawdę długo, ale było fajnie

Test

$ for i in {-129..257}; do echo -n "$i: "; ./neg2.sh $i; done | grep ': 1'
-128: 1
-32: 1
-8: 1
-2: 1
1: 1
4: 1
16: 1
64: 1
256: 1

Wyjaśnienie

Główny korpus ma dwie połówki, obie próbują wyrównać zero do mocy -2.

q=l(sqrt(n*n))               % ln of the absolute value of the input
p=4*a(1)                     % pi: arctan(1) == pi/4
q/l(2) -> l(sqrt(n*n))/l(2)  % change of base formula -- this gives
                             % the power to which 2 is raised to equal
                             % sqrt(n*n). It will be an integer for 
                             % numbers of interest
n<1                          % 1 if true, 0 if false. for negative
                             % numbers check for powers of 2
n>1                          % for positive numbers, check for powers
                             % of 4
c(q/l(2)*p/2)                % cos(n*pi/2) == 0 for integer n (2^n)
s(q/l(4)*p)                  % sin(n*pi) == 0 for integer n (4^n)
(....)^2==0                  % square the result because numbers are
                             % not exactly zero and compare to 0
JoshRagem
źródło
Nigdy nie spodziewałem się trygonometrii! Dobra odpowiedź!
Toby Speight
2

Fouriera , 53 bajty

I~X1~N~G0(0-2*G~GX*X~PG*G>P{1}{0~O~N}G{X}{1~O0~N}N)Oo

Później będę pracował nad golfem, ale jego zarys jest następujący:

X = User input
G = N = 1
Loop until N = 0
    G = -2 * G
    P = X*X 
    If G*G > P then
        N = O = 0
    End if
    If G = X then
        O = 1
        N = 0
    End if
End loop
Print O

Gdzie wyjście jest 0dla falsey i 1dla prawdy .

Wypróbuj online!

Rozpad beta
źródło
W opisie algo nie byłoby lepiej nie używać zmiennej P i pisać Jeśli G * G> X * X to ...?
RosLuP
@RosLuP Byłoby lepiej, ale Fourier po prostu traktowałby to jako(G*G > X)*X
Rozpad Bety
2

Casio BASIC , 76 bajtów

Zauważ, że 76 bajtów to, co mówi mój kalkulator.

?→X
0→O
While Abs(X)≥1
X÷-2→X
If X=1
Then 1→O
IfEnd
WhileEnd
O

To moje pierwsze przedsięwzięcie w Casio BASIC ... Nigdy nie zdawałem sobie sprawy, że mogę napisać tak przyzwoite programy na kalkulatorze: D

Rozpad beta
źródło
1

Python 2.7, 40 bajtów

a=input()
while a%-2==0:a/=-2
print a==1

Podziękowania dla pana Xcodera za oryginalny kod o długości 43 bajtów. Musiałem opublikować jako osobną odpowiedź, ponieważ nie mam wystarczającej reputacji, aby móc komentować.

Koishore Roy
źródło
Jest to trochę to samo, ponieważ moja wersja odpowiedzi jest uniwersalna, więc działa zarówno w Pythonie 2, jak i 3. Jeśli miałbyś to zrobić w Pythonie 3, powinieneś dodać coś, int(input())co przekroczyłoby limit def-jak funkcja. Dodatkowo w Pythonie 3 musisz użyć, print()który zmarnowałby 1 bajt. Właśnie dlatego wybrałem ten sposób, ponieważ w Pythonie 3 robi się on dłuższy ...
Pan Xcoder
1

Siatkówka , 27 bajtów

+`(1+)\1
$1_
^(1|-1_)(__)*$

Wypróbuj online!

Pobiera dane wejściowe jednoargumentowe, co jest dość standardowe dla Retina. Pierwsze dwa wiersze wykonują częściową konwersję jednoargumentową na binarną na podstawie pierwszych dwóch wierszy kodu z pozycji samouczka (wszelkie obce 1spowodują, że dopasowanie i tak się nie powiedzie), podczas gdy ostatni wiersz sprawdza moc czterech lub ujemną moc nieparzystą z dwóch.

+`(1+)\1\1\1
$1_
^(-1)?1_*$

Wypróbuj online!

Tym razem dokonuję częściowej jedności, aby oprzeć cztery konwersje. Moce czterech kończą się tak ^1_*$, jak podczas gdy ujemne nieparzyste moce dwóch kończą się jako ^-11_*$.

+`\b(1111)*$
$#1$*
^(-1)?1$

Wypróbuj online!

Tym razem dzielę tyle, ile mogę, i sprawdzam, 1czy -11na końcu.

+`\b(1+)\1\1\1$
$1
^(-1)?1$

Wypróbuj online!

Kolejny sposób dzielenia przez cztery. I wciąż irytująco 27 ​​bajtów ...

Neil
źródło
1

Schemat, 60 bajtów

(define(f n)(cond((= 1 n)#t)((<(abs n)1)#f)(#t(f(/ n -2)))))

Rozwiązanie rekurencyjne.

Pingwin
źródło