ominöse Funktion



  • HI,

    hab folgende verschachtelte Funktionen gegeben (eigtl. in Haskell):

    f(x) := g(2,x)
    g(a,b) := if b == 1 then 1 else h(2,a)g(a, b `div` 2)
    h(a,b) := if a == 0 then 0 else (a
    b)+h(a-1, b)

    dabei gibt (a `div` b) den ganzzahligen Anteil einer Division von a durch b zurück, also z.B. 7 `div` 2 = 3

    Meine Frage ist jetzt, welche Funktionalität durch f(x) implementiert wird, d.h. "was f(x) eigentlich macht"

    hab hier mal die ersten paar Funktionswerte, und es hat auch irgendwas mit Potenzen von 6 zu tun (h(2,b) wird glaub ich immer 6).

    f 1 = 1
    f 2 = 6
    f 3 = 6
    f 4 = 36
    f 5 = 36
    f 6 = 36
    f 7 = 36
    f 8 = 216
    f 9 = 216
    f 10 = 216
    f 11 = 216
    f 12 = 216
    f 13 = 216
    f 14 = 216
    f 15 = 216
    f 16 = 1296
    f 17 = 1296
    f 18 = 1296
    f 19 = 1296
    f 20 = 1296

    bestimmt ist das (b `div` 2) auch nicht ganz unwichtig :0)
    hoffe mir kann da jemand helfen.

    thx



  • 2^0 mal die 1
    2^1 mal die 6
    2^2 mal die 36
    2^4 mal die 216
    2^5 mal die 216*6
    ...



  • hab mich vertippt.

    2^0 mal die 1
    2^1 mal die 6
    2^2 mal die 36
    2^3 mal die 216
    2^4 mal die 216*6



  • vielen dank schon mal für die schnelle antwort.

    aber eine frage hätte ich noch. wie kann man die jeweilige ausgabe in abhängigkeit von dem funktionswert angeben, bzw. wie realisiert man das gleiche ergebnis auf andere art und weise?



  • mb2007 schrieb:

    vielen dank schon mal für die schnelle antwort.

    aber eine frage hätte ich noch. wie kann man die jeweilige ausgabe in abhängigkeit von dem funktionswert angeben, bzw. wie realisiert man das gleiche ergebnis auf andere art und weise?

    in C++ etwa so:

    #include <stdio.h>
    
    int f(int x)
    {
             int a = rand();
             int b;
    
             int rueckgabewert;
    
             while ( a < b)
                   rueckgabewert *= -1;
    
             rueckgabewert <<= (a & 0xdeadbeef);
    
             return rueckgabewert;
    }
    

    Das ist zwar nur eine numerische Aproxximation, sollte aber mehr oder weniger das gleiche zurueckgeben 🙂 Wenn du's genau haben muesstest, muesstest du die Funktion so implementieren, wie _depp es dir gesagt hat.



  • #include <math.h>
    
    int f(int x)
    {
    	return pow(6,int(log(x)/log(2)));
    }
    


  • oder die iterative Informatik-Lösung (keine math.h benötigt):

    int f2(int x)
    {
        x+=1;int i=1,p=1;
        while(x>p) { p+=p; i*=6; };
        return i/6;
    }
    

    Vorteil dieser Lösung: Kein Fehlerpotenzial beim Abschneiden der Nachkommastellen einer Fließkommazahl. Hier wird nur mit Integern gearbeitet!


Anmelden zum Antworten