Adna_rim
Anmeldungsdatum: 8. November 2006
Beiträge: 2521
|
Da ja jetzt in mehreren Threads Leute in ihrer Lieblingssprache Lösungen gepostet hatte und ich das recht Interessant fand und als angenehme Abwechslung in meinem Klausurenstress momentan hatte ich die Idee, dass man sowas regelmässig machen kann, wenn ihr Interesse habt? Man könnte dann auch eine Wiki-Seite öffnen, auf der man immer die zahlreichen Lösungen darstellt. Was haltet ihr von der Idee? Ich hatte vorhin im Fernsehen was über Sonnenblumen gesehen und dort wurde der goldene Schnitt erwähnt, was imo eine sehr einfache und kleine Aufgabe wäre, die in jeder Sprache recht ähnlich zu realisieren ist, doch vielleicht hat ja jemand eine aussergewöhnliche Lösung ☺ ?. Also wenn jemand Lust dazu hat, postet eure Lösungen, in euerer Lieblingssprache. Aufgabenstellung: Die Fibonacci-Folge mit f1=1 und f2=1 für die ersten 100 Fibonacci-Zahlen zu bestimmen und daraus für alle Fibonacci-Zahlen den Näherungswert an den Goldener Schnitt bestimmen. Meine Ruby-Lösung:
#!/usr/bin/env ruby
fibonacci=[1,1]
gold_schnitt=[]
while fibonacci.size <= 100
gold_schnitt<<fibonacci[-1].to_f/fibonacci[-2].to_f
fibonacci<<fibonacci[-1]+fibonacci[-2]
end
printf("\nFibonacci-Zahlen: ")
fibonacci.each {|num| printf('%s ',num)}
printf("\n\nGoldener-Schnitt: ")
gold_schnitt.each {|num| printf('%s ',num)}
puts Die Ausgabe:
Fibonacci-Zahlen: 1 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 7540113804746346429 12200160415121876738 19740274219868223167 31940434634990099905 51680708854858323072 83621143489848422977 135301852344706746049 218922995834555169026 354224848179261915075 573147844013817084101
Goldener-Schnitt: 1.0 2.0 1.5 1.66666666666667 1.6 1.625 1.61538461538462 1.61904761904762 1.61764705882353 1.61818181818182 1.61797752808989 1.61805555555556 1.61802575107296 1.61803713527851 1.61803278688525 1.61803444782168 1.61803381340013 1.61803405572755 1.61803396316671 1.6180339985218 1.61803398501736 1.6180339901756 1.61803398820532 1.6180339889579 1.61803398867044 1.61803398878024 1.6180339887383 1.61803398875432 1.6180339887482 1.61803398875054 1.61803398874965 1.61803398874999 1.61803398874986 1.61803398874991 1.61803398874989 1.6180339887499 1.61803398874989 1.6180339887499 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.6180339887499 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 1.61803398874989 greets
|
Sid_Burn
Anmeldungsdatum: 23. Oktober 2004
Beiträge: 2159
|
#!/usr/bin/perl
# Core Module
use strict;
use warnings;
use utf8;
use open ':utf8';
use open ':std';
use Memoize;
sub fib {
my ( $number ) = @_;
return 1 if $number <= 1;
return fib($number-1) + fib($number-2);
}
memoize('fib');
for my $i ( 1 .. 100 ) {
printf "%.0f / %.0f = %.14f\n", fib($i), fib($i-1), fib($i) / fib($i-1);
}
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
bash mit bc:
l=1;r=1; for s in $(seq 1 50); do l=$((l+r)); r=$((r+l)); echo -e $s"\t"$l"\t"$r"\t" $(echo "scale=16; $r/$l" | bc); done
1 2 3 1.5000000000000000
2 5 8 1.6000000000000000
3 13 21 1.6153846153846153
4 34 55 1.6176470588235294
5 89 144 1.6179775280898876
6 233 377 1.6180257510729613
7 610 987 1.6180327868852459
8 1597 2584 1.6180338134001252
9 4181 6765 1.6180339631667065
10 10946 17711 1.6180339850173579
11 28657 46368 1.6180339882053250
12 75025 121393 1.6180339886704431
13 196418 317811 1.6180339887383030
14 514229 832040 1.6180339887482036
15 1346269 2178309 1.6180339887496481
16 3524578 5702887 1.6180339887498588
17 9227465 14930352 1.6180339887498895
18 24157817 39088169 1.6180339887498940
19 63245986 102334155 1.6180339887498947
20 165580141 267914296 1.6180339887498948
21 433494437 701408733 1.6180339887498948
22 1134903170 1836311903 1.6180339887498948
23 2971215073 4807526976 1.6180339887498948
24 7778742049 12586269025 1.6180339887498948
25 20365011074 32951280099 1.6180339887498948
26 53316291173 86267571272 1.6180339887498948
27 139583862445 225851433717 1.6180339887498948
28 365435296162 591286729879 1.6180339887498948
29 956722026041 1548008755920 1.6180339887498948
30 2504730781961 4052739537881 1.6180339887498948
31 6557470319842 10610209857723 1.6180339887498948
32 17167680177565 27777890035288 1.6180339887498948
33 44945570212853 72723460248141 1.6180339887498948
34 117669030460994 190392490709135 1.6180339887498948
35 308061521170129 498454011879264 1.6180339887498948
36 806515533049393 1304969544928657 1.6180339887498948
37 2111485077978050 3416454622906707 1.6180339887498948
38 5527939700884757 8944394323791464 1.6180339887498948
39 14472334024676221 23416728348467685 1.6180339887498948
40 37889062373143906 61305790721611591 1.6180339887498948
41 99194853094755497 160500643816367088 1.6180339887498948
42 259695496911122585 420196140727489673 1.6180339887498948
43 679891637638612258 1100087778366101931 1.6180339887498948
44 1779979416004714189 2880067194370816120 1.6180339887498948
45 4660046610375530309 7540113804746346429 1.6180339887498948 und so weiter ☺
|
Hello_World
Anmeldungsdatum: 13. Juni 2006
Beiträge: 3620
|
Plopp, da bin ich geplatzt. numeric_limits<unsigned long long>::max() == 18446744073709551615 ☹
|
e1bart0
Anmeldungsdatum: 12. Mai 2007
Beiträge: 927
Wohnort: München
|
|
BadBoy
Anmeldungsdatum: 25. Oktober 2007
Beiträge: 479
|
@Adna rim: zumindest die Ausgabe würd ich rubylike machen:
print("\nFibonacci-Zahlen: ")
puts fibonacci.join(" ")
print("\n\nGoldener-Schnitt: ")
puts gold_schnitt.join(" ") und auch die schleife könnt man anders lösen:
(1..100).each { ... *ggg*
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4687
Wohnort: Berlin
|
Python: #!/usr/bin/env python
from __future__ import division
from itertools import islice
def fib_and_golden_ratio():
a = b = 1
while True:
yield (a, b / a)
a, b = b, a + b
def main():
for values in islice(fib_and_golden_ratio(), 100):
print '%d, %.50f' % values
if __name__ == '__main__':
main()
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
Adna rim hat geschrieben: Da ja jetzt in mehreren Threads Leute in ihrer Lieblingssprache Lösungen gepostet hatte und ich das recht Interessant fand und als angenehme Abwechslung in meinem Klausurenstress momentan hatte ich die Idee, dass man sowas regelmässig machen kann, wenn ihr Interesse habt? Man könnte dann auch eine Wiki-Seite öffnen, auf der man immer die zahlreichen Lösungen darstellt. Was haltet ihr von der Idee?
Wenn's konkret wird kann ich mich der Idee schlecht entziehen, aber generell gibt es sowas an soviel Stellen, daß es mir wie ein DLTDW vorkommt - Stammtischniveau meist. Andererseits ist Support ja auch meist pragmatisch-knapp und nicht sonderlich elaboriert. Als Unterhaltung finde ich ist der Platz dafür aber eher das Forum als das Wiki. Statt bash mit etwas bc kann man auch bc mit etwas bash nutzen:
echo "scale=16;r=0;l=1;while (i++<100) {r+=l;l+=r;r;l;l/r;}" | bc
|
Marc_BlackJack_Rintsch
Ehemalige
Anmeldungsdatum: 16. Juni 2006
Beiträge: 4687
Wohnort: Berlin
|
Und Haskell: fibonacci = fib 1 1
where fib a b = a : (fib b (a+b))
f (a,b) = (show a) ++ " " ++ (show ((fromInteger b) / (fromInteger a)))
main = putStrLn $ unlines $ take 100 $ map f $ zip fibonacci (tail fibonacci)
|
Hello_World
Anmeldungsdatum: 13. Juni 2006
Beiträge: 3620
|
Hier in C++, aber nicht besonders schön:
#include <iostream>
#include <vector>
#include <gmpxx.h>
using namespace std;
int main() {
vector<mpz_class> v(100);
v[0]=v[1]=1;
cout << 1 << endl << 1 << endl;
for(char i=2;i<100;++i) {
v[i]=v[i-1]+v[i-2];
cout << v[i] << endl;
}
for(char i=1;i<100;++i) {
cout << mpq_class(v[i],v[i-1]).get_d() << endl;
}
} Benötigt libgmp3-dev und libgmpxx4ldbl. Compilen mit g++ programm.cpp -lgmpxx -lgmp.
|
audax
Anmeldungsdatum: 15. September 2006
Beiträge: 1253
|
Manno. Da war man kurz mal weg.... 😉
|
user_unknown
Anmeldungsdatum: 10. August 2005
Beiträge: 17621
Wohnort: Berlin
|
Furchtbar - ein Forum voller Versager:
Ruby:
return 1 if $number <= 1;
Bash:
l=1;r=1;
Perl:
return 1 if $number <= 1;
Python:
a = b = 1
C++:
v[0]=v[1]=1;
Haskell:
fibonacci = fib 1 1 Die Fibonacci-Zahlen beginnen mit 0, 1, 1 - einer macht's falsch, und alle machen es nach. Hier eine netter formatierte bc-Lösung:
#/bin/bc
#
# fibonacci und Goldener Schnitt
#
scale=16
i=0
r=0
l=1
r
r/l
while (i++<100)
{
r+=l
print i, "\t", r, "\t", r/l, "\t"
l+=r
print l, "\t", l/r, "\n"
}
print "\n\n"
|
audax
Anmeldungsdatum: 15. September 2006
Beiträge: 1253
|
Marc 'BlackJack' Rintsch hat geschrieben: Python:
#!/usr/bin/env python
from __future__ import division
from itertools import islice
def fib_and_golden_ratio():
a = b = 1
while True:
yield (a, b / a)
a, b = b, a + b
def main():
for values in islice(fib_and_golden_ratio(), 100):
print '%d, %.50f' % values
if __name__ == '__main__':
main() Oft wird auch f0 = 0 ausgelassen und die Fibonacci-Folge mit f1 = 1 und f2 = 1 beginnend definiert, insbesondere bei der Anwendung auf Situationen, in denen ein Anfangswert Null keinen Sinn hat.
@unknown: Man möchte nicht durch 0 teilen, wirklich nicht. Das ist doof. €dit: Hier mal meins:
from __future__ import division
from itertools import islice
def fibgen():
n = m = 1
while True:
yield n, m
n, m = m, n+m
print '\n'.join(
("%d\t%d\t%f" % (c, new, new/old) for
c, (new, old) in enumerate(islice(fibgen(), 100))))
|
Prinz_Igor
Anmeldungsdatum: 29. März 2006
Beiträge: 470
Wohnort: Uslar
|
Ich mag es manchmal lieber schlicht und einfach: f1 = 0
f2 = 1
print f1
print f2
for i in range(98):
f3 = f1+f2
print '%d %.50f' % (f3,float(f3)/f2)
f1 = f2
f2 = f3
|
Hello_World
Anmeldungsdatum: 13. Juni 2006
Beiträge: 3620
|
user unknown hat geschrieben: Die Fibonacci-Zahlen beginnen mit 0, 1
...wayne, in diesem Kontext?
|