ubuntuusers.de

Fibonacci-Reihe und rekursive Schreibweise

Status: Ungelöst | Ubuntu-Version: Kubuntu 20.10 (Groovy Gorilla)
Antworten |

maatin

Anmeldungsdatum:
30. Juni 2020

Beiträge: 2

Hey Leute hab für heute eine Abgabe und ziemlich schlechte Woche gehabt bin ziemlich am Anfang des Studiums, deshalb dachte ich die Aufgaben wären hier schnell gelöst. Recherche im Internet hat nicht immer was gebracht bzw weichen stark von meiner Aufgabe ab. Hatte auch was zu Quersummen etc auf dem Aufgabenblatt, jedoch konnte ich mich da ein wenig durchzwingen. Hierbei aber bräuchte ich evtl Hilfe. 1.3 bis 1.6 im Anhang.

Bearbeitet von sebix:

Bitte wähle in Zukunft einen aussagekräftigen Titel und packe da nicht "Wichtig °!!" rein.

Anhang

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

PS: das mit dem Googeln solltest du neben den Grundlagen zu Python noch mal üben und ich halte das für keine gute Idee sich bei absoluten Basics in Mathe und dem Umgang mit einer Sprache Lösungen zu erschleichen, weil man ohne die bei so einem Studiengang später nicht weit kommt...

maatin

(Themenstarter)

Anmeldungsdatum:
30. Juni 2020

Beiträge: 2

Danke für die schnelle Rückmeldung. Das das so nicht weitergehen kann ist klar. Hab bisher auch alles selbst gemacht, aber seit RegEx hab ich Schwierigkeiten, da ich programmieren an sich nicht als modul dieses semester hab und auch sonst keine Grundlagen für die Informatik beseitze. Und bei beidem muss ich zugeben haben viele zurzeit durch die Online Vorlesungen Schwierigkeiten mitzukommen.

rklm Team-Icon

Projektleitung

Anmeldungsdatum:
16. Oktober 2011

Beiträge: 13372

seahawk1986 schrieb:

PS: das mit dem Googeln solltest du neben den Grundlagen zu Python noch mal üben und ich halte das für keine gute Idee sich bei absoluten Basics in Mathe und dem Umgang mit einer Sprache Lösungen zu erschleichen, weil man ohne die bei so einem Studiengang später nicht weit kommt...

Als jemand, der gerade wieder Personal sucht, kann ich noch hinzufügen, dass Vorspiegeln von Fachkenntnissen nicht funktioniert. So etwas kommt sehr schnell heraus.

seahawk1986

Anmeldungsdatum:
27. Oktober 2006

Beiträge: 11311

Wohnort: München

https://dabeaz-course.github.io/practical-python/ könnte eventuell etwas für dich sein, wenn du Probleme mit den typischen Konstrukten in Python hast - das zeigt in den ersten Kapiteln recht schön, wie man mit Strings, Zahlen, Konditionen, Schleifen, Funktionen usw. arbeiten kann.

Reguläre Ausdrücke sind ein bisschen Fleißarbeit, da hilft nur viel üben, bis man die halbwegs flüssig Lesen und Schreiben kann. Als Einführung (ich weiß ja nicht, wie gut die Vorlesungen und Übungen an deiner TH sind) könnte Al Sweigart Yes, It's Time to Learn Regular Expressions PyCon 2017 eventuell nützlich sein.

Die Aufgaben erfordern eigentlich nicht viel an IT-Grundlagen und Mathematisch ist da auch nichts dabei, das ich in der Oberstufe nicht schon mal gesehen hatte - du musst als erstes den Algorithmus ausarbeiten - für den Mittelwert aus 1.3 kann man direkt die Definition aus der Wikipedia übernehmen: "Das arithmetische Mittel ist die Summe der gegebenen Werte geteilt durch die Anzahl der Werte." Die einzige Herausforderung ist also die Summe und die Anzahl zu bestimmen.

Dann schreibt sich dann eigentlich fast von alleine, wenn man weiß, wie eine for-Schleife in Python funktioniert:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/usr/bin/env python3
data = [500, 504, 499, 399, 590, 123, 430, 758, 938, 637, 750, 735]

def mean(data):
    sum_elements = 0
    num_elements = 0
    for e in data:
        sum_elements = sum_elements + e
        num_elements = num_elements + 1
    return sum_elements / num_elements

mean(data)

Das ist eine recht generische Variante, die man so in jeder Programmiersprache umsetzen könnte, die for(each)-Schleifen unterstützt - das ist aber eigentlich unnötig viel Code für Python.

Mit dem Built-ins sum() und len() (die man in der Übungsaufgabe nicht verwenden soll) sieht das schon schöner aus:

1
2
def mean(data):
    return sum(data)/len(data)

Und wenn man das nicht selber implementieren will, gibt es da noch das bereits erwähnte mean() aus der Standard Library, die dann auch noch eine brauchbare Fehlerbehandlung mitbringt:

1
from statistics import mean

Bei Fibronacci-Zahlen und sonstigen Spielereien wie Fizz buzz kann es sich lohnen sich mal vorab eine Lösung zurecht zu legen, damit man sich dann im Eifer des Gefechts nicht unnötig verzettelt...

Neral

Anmeldungsdatum:
3. Oktober 2007

Beiträge: 230

Ich habe einfach mal 1.2 bis 1.6 gelöst:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <cstdint>

#include <array>
#include <iostream>
#include <string_view>

constexpr auto odd(auto const x) -> bool;

constexpr auto even(auto const x) -> bool {
    if (x == 0) {
        return true;
    }
    return odd(x - 1);
}

constexpr auto odd(auto const x) -> bool {
    if (x == 0) {
        return false;
    }
    return even(x - 1);
}

constexpr auto hoch(auto const x, uint64_t const y) -> decltype(x) {
    if (y == 0) {
        return decltype(x){1};
    }
    auto const a = hoch(x, y / 2);
    if (even(y)) {
        return a * a;
    }
    else {
        return x * a * a;
    }
}

constexpr auto for_each(auto const begin, auto const end, auto const f) -> void {
    for (auto it = begin; it < end; ++it) {
        f(*it);
    }
}

constexpr auto mean(auto const begin, auto const end) -> decltype(*begin / size_t{0}) {
    auto len = size_t{0};
    auto acc = decltype(*begin){0};
    for_each(begin, end, [&](auto const& x) { ++len; acc += x; });
    return acc / len;
}

constexpr auto fibonacci(uint64_t const n) -> uint64_t {
    if (n <= 1) {
        return n;
    }
    else {
        return fibonacci(n - 1) + fibonacci(n - 2);
    }
}

auto print_reverse(std::string_view const s) -> void {
    for_each(rbegin(s), rend(s), [](auto const& c) { std::cout << c; });
}

auto main() -> int {
    std::cout << "Enter x: ";
    double x;
    std::cin >> x;
    std::cout << "\nEnter y: ";
    uint64_t y;
    std::cin >> y;
    std::cout << "\nhoch(" << x << ", " << y << ") = " << hoch(x, y) << '\n';
    std::cout << "even(" << y << ") = " << std::boolalpha << even(y) << '\n';

    auto const xs = std::array{42, 27, 12, 104, 25};
    std::cout << "mean(xs) = " << mean(begin(xs), end(xs)) << '\n';

    std::cout << "fibonacci(" << 5 * y << ") = " << fibonacci(5 * y) << '\n';

    print_reverse("\nHallo, Welt.\n");
}

Ich muss sagen, seit C++20 fühlt sich C++ fast wie Python an. 😇

Und die Frage nach der Oberfläche des Moleküls ist ein wenig... Naja.

Antworten |