Сортиране на три числа във възходящ ред

Вчера се прибрах вкъщи и реших да опитам да напиша програма за схема, която да сортира три числа във възходящ ред. Ето какво измислих:

(define a 3)
(define b 2)
(define c 1)

(define temp 0)

(cond
    ( (> a c) (set! temp c) (set! c a) (set! a temp))
    ( (> b c) (set! temp c) (set! c b) (set! b temp))
    ( (> a b) (set! temp b) (set! b a) (set! a temp))
    ( (> b c) (set! temp c) (set! b c) (set! b temp))
)

(display a)
(display b)
(display c)

Това функционален начин ли е за решаване на проблема? Какво бихте предложили?


person janvidar    schedule 01.05.2011    source източник
comment
Не знам схемата, но мога да ви кажа, че това не е функционално, процедурно е.   -  person Oliver Charlesworth    schedule 01.05.2011
comment
Идеята ми беше да имам функция, която да разменя стойностите на две променливи (a и b) на a е по-голямо от b. Не съм сигурен обаче дали това би направило това по-прилично. Благодаря, че отделихте време да прочетете това :)   -  person janvidar    schedule 01.05.2011


Отговори (1)


Scheme има вградена функция за сортиране, която всъщност е по-бърза в някои случаи от всички алоритми за сортиране, които използваме.

(sort < '(5 2 6))

се завръща

'(2 5 6)

Основният проблем, който виждам с вашата процедура, е, че изпълнявате суап само веднъж. Това е чудесно, ако можете да гарантирате, че едното винаги ще бъде в средата на другите две, но не съм толкова сигурен, че винаги ще бъде така. Също така комплект! е доста грозна и когато научих схемата, моят професор ми каза да не я използвам, защото изисква много ресурси и има по-добри начини да го направя. Бих препоръчал да ги поставите всички в списък и след това да ги сортирате и да ги извадите от списъка, ако искате да го направите по този начин.

person bringel    schedule 01.05.2011
comment
Благодаря shadesandcolour, не знаех, че set! изисква много ресурси, ще продължа да проучвам за това. Освен това, ако някой се интересува, току-що намерих това Примери за сортиране на схеми - person janvidar; 01.05.2011