Sequenza di Fibonacci...

Stato
Discussione chiusa ad ulteriori risposte.

FreakTux

Utente Silver
16 Dicembre 2008
36
11
0
66
Dato in input un numero i si trovi la iesima cifra della sequenza di Fibonacci...
Il mio sorgente in C è:

Codice:
#include <stdio.h>

main(){

  int prec1 = 0, prec2 = 1, valore, numero, indice;

  printf("Inserire il num corrispondente alla\ncifra che si vuole trovare.\n");
  scanf("%d", &numero);
  while(numero <= 0){
    printf("operazione non consentita. Reinserire i dati.\n");
    scanf("%d", numero);
   }
  if(numero == 1)
    printf("Il risultato è 1.\n");
  else{
    indice = numero;
    while(indice > 0){
      valore = prec1 + prec2;
      prec1  = prec2;
      prec2  = valore;
      indice --;
    }
  printf("Il valore della cifra corrispondente a %d è %d.\n", numero, valore);
 }
}
 
[C++]
Codice:
#include <iostream>
using namespace std;
int main() {
  int a=0, b=1;
  int num, temp, i;
  cout << "Inserisci il numero della sequenza:";
  cin >> num;
  for(i=0; i<num;i++) {
    temp=b;
    b+=a;
    a=temp;
  }
  cout << b;
  return 0;
}
 
visto che in C già c'era ho deciso di farlo con la ricorsione:

Codice:
#include <stdio.h>
#include <stdlib.h>

int fibonacci(int num);

main(){

  int prec1 = 0, prec2 = 1, valore, numero, indice;

  printf("Inserire il num corrispondente alla\ncifra che si vuole trovare.\n");
  scanf("%d", &numero);
  while(numero <= 0){
    printf("operazione non consentita. Reinserire i dati.\n");
    scanf("%d", numero);
   }
  if(numero == 1) {
    printf("Il risultato %c 1.\n",138);
    system("pause");
} else {
  printf("Il valore della cifra corrispondente a %d %c %d.\n", numero, 138, fibonacci(numero));
  system("pause");
}
}

int fibonacci(int num){
    if(num>0){
        return fibonacci(num-1)+fibonacci(num-2);
    } else if (num==0) {
        return 1;
    } else {
        return 0;
    }
}
 
il topic è un po' vecchiotto pero per non aprirne un'altro:

PHP:
<?php
$a = htmlspecialchars($_POST['a']);
$b = ($a-1)+($a-2);
$invio = htmlspecialchars($_POST['invio']);
 
if($a == 0){
 echo"error";
} elseif($a ==1) {
echo"valore = 1";
} elseif ($a < 0){
echo" erro"; }
elseif($a > 1){
echo"$b";
}
?>
<html><head><title>Fibonacci's sequences</title></head>
<body>
<form action="fibonacci.php" method="post">
<input type="text" name="a">
<input type="submit" name="invio">
</form>
</html>
 
azzo non avevo postato il mio, eccolo:
Codice:
#!/usr/bin/perl -w
$num = shift;
@fib = (0,1);
while ($#fib < $num) {
push @fib , $fib[-2] + $fib[-1];
}
print "$fib[-2]\n";

ed ecco la versione ridotta:
Codice:
$a=shift;@b=(0,1);push@b,$b[-2]+$b[-1]while$#b<$a;print"$b[-2]\n";

66 caratteri. vi sfido a fare di meglio.
 
@_MasteR: Quel codice non funziona mica.... leggiti i codici degli altri, ho il dubbio che tu non abbia capito l'algoritmo
 
Oromis92 ha detto:
ed ecco la versione ridotta:
Codice:
$a=shift;@b=(0,1);push@b,$b[-2]+$b[-1]while$#b<$a;print"$b[-2]\n";

66 caratteri. vi sfido a fare di meglio.

Codice:
$a=shift;@b=(0,1);push@b,$b[-2]+$b[-1]while$#b<$a;print$b[-2]

61, I won.
 
orakool ha detto:
@_MasteR: Quel codice non funziona mica.... leggiti i codici degli altri, ho il dubbio che tu non abbia capito l'algoritmo

scusa ma la successione di fibonacci non consiste nel:

(n-1)+(n-2)
n sta per numero

??

P.s. se non è così scusatemi ma questo ho trovato su google :asd: magari ho capito male io
 
hai capito male....
l'n-esimo numero è dato dalla somma dei 2 numeri precedenti della stessa sequenza di fibonacci....
dove il primo e il secondo numero sono uguali a 1.

matematicamente per ricorsione, la successione si scrive:
A1 = 1
A2 = 1
An = A(n-2) + A(n-1) n appartiene a N (naturali)


A1 (termine con indice 1)
A2 (termine con indice 2)
An (termine con indice n)
A(n-x) (termine con indice n-x)
 
Whivel ha detto:
hai capito male....
l'n-esimo numero è dato dalla somma dei 2 numeri precedenti della stessa sequenza di fibonacci....
dove il primo e il secondo numero sono uguali a 1.

matematicamente per ricorsione, la successione si scrive:
A1 = 1
A2 = 1
An = A(n-2) + A(n-1) n appartiene a N (naturali)


A1 (termine con indice 1)
A2 (termine con indice 2)
An (termine con indice n)
A(n-x) (termine con indice n-x)
 
Dato che in C è già stato proposto più volte... Ecco il mio in Visual Basic (evitate insulti et simila per favore XD)

Dovrebbe funzionare ma non ho testato.

Codice:
Sub Command1_Click()

Dim i, n, s, l, num As Integer

i = 1
s = 0
l = 0

[color=#6B8E23]'Leggo il numero corrispondente la cifra che si vuole trovare[/color]
num = InputBox("Inserisci numero")

Do While s <= num
	n = i;
	i += l;
	l = n;
	s++;
Loop

[color=#6B8E23]'Stampo il valore ottenuto in una TextBox[/color]
Text1.Text = CStr(i)
 
[ot]
Oromis92 ha detto:
E no no, l' "a capo" ci vuole

Al massimo posso togliere il punto e virgola alla fine xD



Codice:
echo `perl script.pl`
perl script.pl && echo
perl -e 'print `perl script.pl`."\n"'

così sei soddisfatto? lol
[/ot]
 
Whivel ha detto:
hai capito male....
l'n-esimo numero è dato dalla somma dei 2 numeri precedenti della stessa sequenza di fibonacci....
dove il primo e il secondo numero sono uguali a 1.

matematicamente per ricorsione, la successione si scrive:
A1 = 1
A2 = 1
An = A(n-2) + A(n-1) n appartiene a N (naturali)


A1 (termine con indice 1)
A2 (termine con indice 2)
An (termine con indice n)
A(n-x) (termine con indice n-x)
capito grazie....
 
Formula di matematica discreta per il calcolo della ricorsione lineare, più veloce, più sicura, più tutto.
[C]
Codice:
#include <stdio.h>

#include <stdlib.h>

#include <math.h>



int fibonacci(int num);



int main(){



	int numero;



	printf("Inserire il num corrispondente alla cifra che si vuole trovare.\n");

	scanf("%d", &numero);

  	while(numero <= 0){

		printf("operazione non consentita. Reinserire i dati.\n");

		scanf("%d", &numero);

	}

	if(numero == 1)

		printf("Il risultato è 1.\n");

	else

		printf("Il valore della cifra corrispondente a %d è %d.\n", numero, fibonacci(numero));

	return 0;

}



int fibonacci(int num){

	if(num<=0) return 0;

	if(num==1) return 1;

	if(num==2) return 1;

	return ((1/sqrt(5))*(pow(((1+sqrt(5))/2),num)))-((1/sqrt(5))*(pow(((1-sqrt(5))/2),num)));

}
P.S.: In realtà non è C, ma C++, se solo non fosse per printf e scanf infatti vi consiglio di compilare con g++, non penso funzioni anche con -std=c99
 
Stato
Discussione chiusa ad ulteriori risposte.