0
votes

Comment faites-vous une fonction récursive F # qui renvoie le caractère de la liste?

La fonction récursive F # doit renvoyer le caractère de la liste qui correspond au plus petit numéro de la liste supérieure au numéro d'entrée.

ex: la fonction de récursive F # devrait être comme:

Si j'entraîne: quelque chose de 0,05 [(0,1, '*'), (0,5, '@'), (1.0, '!')]

Alors sa sortie doit être: '*'

Si j'entraîne quelque chose de 0,6 [(0,1, '*'), (0,5, '@'), (1.0, '!')]

Alors sa sortie doit être: '!'

et si j'entraîne quelque chose 2.0 [(0,1, '*'), (0,5, '@'), (1.0, '!')]

Alors sa sortie devrait être ''


0 commentaires

3 Réponses :


0
votes

Je suggère que votre fonction fait quelque chose comme ceci:

1) Appelez lui-même (la partie récursive) pour trouver le meilleur candidat à la queue de la liste.

2) Comparez le meilleur candidat de l'étape 1 à la tête de la liste et ...

3) Si la tête de la liste est une meilleure solution que celle du candidat de la queue, utilisez la tête, utilisez sinon le candidat queue.


0 commentaires

1
votes

Un peu délicat à itérer sur la "liste" fournie
J'aurais besoin de papier dur les éléments tuples
Que je puisse avoir fait à la fin pour en faire une liste

Contrairement à l'échantillon fourni p> xxx pré>

un tuple de la liste des tuples avec seulement 1 élément p>

et étant donné que tous les éléments sont du même "type"
Je l'ai généralisé sous forme de p> xxx pré>

beaucoup plus facile à itérer et à morsez plus générique p> xxx pré>

it sortit p> xxx pré>

aux questions supplémentaires ... p>

Le plus simple et plus générique est la non récursive (trouver)
(Find1) est plus traditionnel et moins générique de
(Find2) La récursive de Scott, est plus idiomatique
Le tout fait de même, comparer et retourner un sous-produit P>

let list =
    [ (0.1, '*')
      (0.5, '@')
      (1.0, '!') ]

/// non-recursive
let find test map list =
    match list |> List.tryFind test with
    | None -> map None
    | x -> Some(x).Value |> map

/// iterates
let rec find1 test result index (lst: 'a list) =
    if index < list.Length then
        match lst.[index] with
        | x when test x -> Some(x) |> result
        | _ -> find1 test result (index + 1) lst
    else
        result None

/// iterates , idiomatically
let rec find2 test result index lst =
    match lst with
    | [] -> result None
    | head :: tail ->
        if test head then Some(head) |> result
        else find2 test result index tail

let greaterThanIndex index = fun (value, _) -> value > index

let map x =
    match x with
    | None -> '\000'
    | Some(_, chr) -> chr

printf "ctrl+c to quit!\n"

// the 'input function'?
match System.Console.ReadLine() with
| input ->
    match System.Double.TryParse input with
    | false, _ ->
        printf "%s: NaN! \n" input
    | _, index ->
        list
        |> find (greaterThanIndex index) map
        |> printf "find: %2.2f in %A = %c\n" index list
        // ...
        list
        |> find1 (greaterThanIndex index) map 0
        |> printf "find1: %2.2f in %A = %c\n" index list
        // ...
        list
        |> find2 (greaterThanIndex index) map index
        |> printf "find2: %2.2f in %A = %c\n" index list


3 commentaires

Y a-t-il un moyen plus simple dans la fonction REC?


Comment écrivez-vous la fonction d'entrée?


Que voulez-vous dire avec "Fonction d'entrée"? Console.Read?



2
votes
let list =
    [ (0.1, '*')
      (0.5, '@')
      (1.0, '!') ]

let rec something index lst =
        match lst with
        | [] -> '\000'
        | h :: t -> 
            let value, chr = h
            if index <= value
            then chr
            else something index t

list 
|> List.sortBy fst // only needed if not already sorted by value
|> something 2.0

2 commentaires

Comment faites-vous que reconnaît quelque chose "(espace avec rien du tout)? ex: Si j'entraîne quelque chose 2.0 [(0,1, '*'), (0.5, '@'), (1.0, '!')], Sortie ultérieurement devrait être '' ;;


Sauf si un espace ou un caractère non-impression est suffisant, vous aurez probablement besoin de gérer cela lorsque vous sortiez les résultats en tant que chaîne. "" Est une chaîne vide, mais '' n'est pas autorisée. Une autre approche serait d'utiliser une liste de chaînes au lieu d'une liste de caractères.