J'ai écrit les fonctions suivantes pour find-index
:Besoin d'aide pour la recherche dans une liste Racket
(: finind : (Listof Integer) Integer -> (Option Integer))
;; helper function for find-index
(define (finind a b)
(let loop ((a a) (c 0))
(cond
((empty? a) 'None)
((equal? (first a) b) (Some c))
(else (loop (rest a) (add1 c))))))
(: find-index : (Integer -> Boolean) (Listof Integer)
-> (Option (Pr (Option Integer) Integer)))
;; return the first item to pass the test, if there is one,
;; along with its (0-based) index
(define (find-index f x)
(match x
('() 'None)
((cons hd '())
(if (f hd) (Some (Pr (finind x hd) hd)) 'None))
((cons hd tl)
(if (f hd) (Some (Pr (finind x hd) hd))
(find-index f tl)))))
Maintenant, finind
fonctionne parfaitement sur lui-même, mais quand je l'utilise avec find-index
, il ne retourne en arrière (Some 0)
. Le résultat pour (finind (list 45 41 9) 9)
est (Some 2)
. Mais, le résultat pour (find-index (lambda ([t : Integer]) (< t 10)) (list 45 41 9))
est (Some (Pr (Some 0) 9))
, même s'il devrait être (Some (Pr (Some 2) 9))
.
Donc je sais que cela peut arriver parce que j'ai (finind x hd)
pour afficher mon index et parce que hd
il ne change pas. Mais comment puis-je contourner cela? J'ai essayé mais en vain. Puis-je avoir une aide s'il vous plait? Je vous remercie!
Dans le dernier cond cond quand le prédicat est faux, vous êtes récursif à 'find-index' et vous ne transmettez pas le décalage d'index de quelque façon que ce soit, donc il ne peut pas savoir que c'est la troisième fois que vous le faites. Peut-être envelopper avec un index et l'utiliser à la place va résoudre votre problème. – Sylwester
Je ne comprends pas. Pouvez-vous donner un exemple? – testomg
Vous ne passez pas ''(45 41 9)' à 'finind', vous passez la première queue dont la tête satisfait' f', qui est '' (9)'. – molbdnilo