tag:blogger.com,1999:blog-14240039.post1844085096679925449..comments2021-04-08T14:24:16.350+03:00Comments on От дума на дума: За една задача от ФМИZlatozarhttp://www.blogger.com/profile/16257250071061885492noreply@blogger.comBlogger3125tag:blogger.com,1999:blog-14240039.post-72068339460687352612012-10-03T17:28:13.076+03:002012-10-03T17:28:13.076+03:00Аз бих я написал използвайки letrec.
(define (fr...Аз бих я написал използвайки letrec.<br /><br /><i><br />(define (freq-* lst func)<br /> (letrec<br /> ((A (lambda (lat seen)<br /> (cond<br /> ((null? lat) seen)<br /> (else <br /> (let ((curr (car lat)))<br /> (revert <br /> (A (reduce curr lat) <br /> (cons (cons (func curr lat) curr) seen)))))))))<br /> (A lst '())))<br /></i><br /><br />Освен това, като се вижда не ми харесва синатаксиса на метода. Предпочитам:<br /><br />(define (count-freq lat)<br /><br />(define count-freq<br /> (lambda (lat)<br />Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-14240039.post-65687354434490862862012-09-12T14:40:32.771+03:002012-09-12T14:40:32.771+03:00Ако прочетеш "Seasoned Schemer" ще разбе...Ако прочетеш "Seasoned Schemer" ще разбераш, че грешиш за "freq" функцията използва се:<br /><br /><i>The eleventh commandment:<br />Use additional arguments when a function needs to know what the other arguments to the function have been like so far.</i><br /><br />Демек, ако ти трябва да знаеш какво е минало до сега подай допълнителен аргумент. Така единия параметър "казва" нещо допълнително на другия параметър.Anonymousnoreply@blogger.comtag:blogger.com,1999:blog-14240039.post-19267426348816558582012-09-10T14:27:45.664+03:002012-09-10T14:27:45.664+03:00Here is how Poul Graham do it in Common Lisp in hi...Here is how Poul Graham do it in Common Lisp in his book "ANSI Lisp":<br /><br />(defun compress (x)<br /> (if (consp x)<br /> (compr (car x) 1 (cdr x))<br /> x))<br /><br />(defun compr (elt n 1st)<br /> (if (null 1st)<br /> (list (n-elts elt n))<br /> (let ((next (car 1st)))<br /> (if (eql next e l t)<br /> (compr elt (+ n 1) (cdr 1st))<br /> (cons (n-elts elt n)<br /> (compr next 1 (cdr 1st )))))))<br /><br />(defun n-elts (elt n)<br /> (if (> n 1)<br /> (list n elt)<br /> elt))<br /><br />;; (compress '(1 1 1 0 1 0 0 0 0 1))<br />((3 1) 0 1 (4 0) 1)Anonymousnoreply@blogger.com