2010-05-18 3 views
1

que je dois écrire une fonction pour répondre à cette entrée -> Liste de sortie:Ecrire une fonction basée sur TestUnit donné

0 -> 0 
1 -> 1 
3 -> 2 
4 -> 3 
5 -> 5 
7 -> 13 
9 -> 34 

f (x) = ??

+1

Si vous remplissez f (x) pour x dans {2, 6, 8} vous pouvez trouver que la séquence est plus facile à repérer. Aussi, les questions de devoirs (et cela ressemble beaucoup à un) devraient être étiquetés devoirs. – Johnsyweb

+1

Qu'est-ce que cela a à voir avec le test unitaire ou le reverse engineering? –

Répondre

2

Eh bien, qui est incroyablement facile ... si vous n'êtes pas préoccupé par surajustement, vous pouvez le faire:

switch(input) 
    case 0: report 0 
    case 1: report 1 
    case 3: report 2 
    ... 
    default: report whatever 

Vous avez probablement plus de contraintes sur le problème si vous voulez un bonne solution. Vous pouvez aussi envisager de représenter graphiquement la fonction pour voir s'il y a un motif évident, ou peut-être montrer les bits impliqués. Il serait également utile de savoir si les entrées et les sorties sont des valeurs entières ou des valeurs réelles (la fonction est-elle supposée être continue ou discrète?). Sans cette information, c'est un peu difficile d'aider.

Modifier
Afficher les nombres manquants aide:

0 -> 0
1 -> 1
2 -> 1
3 -> 2
4 -> 3
5 -> 5
6 -> 8
7 -> 13
8 -> 21
9 -> 34

(C'est le nombre Fibonnaci: f (x) = f (x-1) + f (x-2), où f (0) = 0 et f (1) = 1).

PS
Ce est une fonction pour laquelle dynamic programming ou memoization est particulièrement utile.

+0

Programmation dynamique? Pourquoi? –

+0

Je suppose que c'est un problème de devoirs ou un casse-tête et il n'a pas reçu les numéros manquants pour le rendre plus difficile (par exemple pour vaincre [OEIS] (http://www.research.att.com/~njas/ séquences/index.html? q = 0% 2C1% 2C1% 2C2% 2C3% 2C5% 2C8% 2C13% 2C21% 2C34 & language = anglais & go = Recherche)) –

+0

@Robert, si vous voulez invoquer la fonction plusieurs fois ou si vous voulez pour renvoyer le résultat pour une large gamme de valeurs, la programmation dynamique vous évitera les calculs redondants.Même si vous invoquez la fonction une seule fois, l'utilisation de la formule récursive f (x-1) + f (x-2) provoque la répétition inutilement des deux forks. Avec la programmation dynamique, les résultats antérieurs sont conservés de sorte que f (i) n'est pas calculé plus d'une fois pour une valeur donnée quelconque i pendant le calcul de f (x). –

1

Je ne sais pas s'il s'agit de devoirs ou non, mais c'est une séquence extrêmement bien connue. Un indice (plutôt grand) est que f (n) dépend de f (n-1) et f (n-2). Si vous n'êtes pas concerné par la simple réponse, click here. La mise en œuvre de la séquence est assez trivialement fait récursive, mais modifier votre message si vous rencontrez des problèmes avec elle et préciser quelle partie vous êtes coincé sur

2

Résolu par Eureqa

round(exp(0.4807*input - 0.799938))

+0

En fait, la séquence est un http://en.wikipedia.org/wiki/Fibonacci_sequence –

+2

@Robert C'est probablement vrai, mais cela ne rend pas sa réponse fausse –

Questions connexes