Approximate overview
A new variant?
Another new variant?
Events
Other good things
Using the big three.
(define longer-string
(lambda (str1 str2)
(if (>= (string-length str1) (string-length str2))
str1
str2)))
(define longest-string
(lambda (strings)
(reduce longer-string strings)))
Using recursion and that helper procedure we just wrote.
(car lst) gives the first element of the list(cdr lst) gives all but the first element of the list.;;; (longest-string strings) -> string?
;;; strings : list-of string? nonempty?
;;; Finds the longest string in a list of strings.
(define longest-string
(lambda (strings)
(if (one-element? strings)
(car strings)
(longer-string (car strings) (longest-string (cdr strings))))))
Using recursion without that helper procedure we just wrote.
(define longest-string
(lambda (strings)
(if (one-element? strings)
(car strings)
(if (>= (string-length (car strings))
(string-length (longest-string (cdr strings))))
(car strings)
(longest-string (cdr strings))))))
Or as
(define longest-string
(lambda (strings)
(cond
[(one-element? strings)
(car strings)]
[(>= (string-length (car strings))
(string-=length (longest-string (cdr strings))))
(car strings)]
[else
(longest-string (cdr strings))])))
Hmmm … This takes a really long time on the list ‘(“a” “aa” “aaa” … “aaaaaaaaaaaaaaaaaaaaaaaaaaaaa”). Why?
Using recursion and local bindings.
(define longest-string
(lambda (strings)
(if (one-element? strings)
(car strings)
(let ([str1 (car strings)]
[str2 (longest-string (cdr strings))])
(if (>= (string-length str1)
(string-length str2))
str1
str2)))))
Morals
longer-string#lang racket
(require rackunit)
(require csc151)
(define longer-string
(lambda (str1 str2)
(if (>= (string-length str1) (string-length str2))
str1
str2)))
;;; (one-element? lst) -> boolean?
;;; lst : a list
;;; Determines if lst has one element.
(define one-element-that-will-get-sam-to-yell-at-you!?
(lambda (lst)
(= (length lst) 1)))
(define one-element?
(lambda (lst)
(and (not (null? lst))
(null? (cdr lst)))))
;;; (longest-string strings) -> string?
;;; strings : list-of string? nonempty?
;;; Finds the longest string in a list of strings.
(define longest-string1
(lambda (strings)
(if (one-element? strings)
(car strings)
(longer-string (car strings) (longest-string1 (cdr strings))))))
(define longest-string2
(lambda (strings)
(cond
[(one-element? strings)
(car strings)]
[(>= (string-length (car strings))
(string-length (longest-string2 (cdr strings))))
(car strings)]
[else
(longest-string2 (cdr strings))])))
(define longest-string3
(lambda (strings)
(if (one-element? strings)
(car strings)
(let ([str1 (car strings)]
[str2 (longest-string3 (cdr strings))])
(if (>= (string-length str1)
(string-length str2))
str1
str2)))))
(define longest-string longest-string3)
(test-equal? "test 1" (longest-string '("hello" "hi")) "hello")
(test-equal? "test 2" (longest-string '("one")) "one")
(test-equal? "test 3" (longest-string '("a" "list" "of" "like" "twenty" "strings" "or" "just" "longer" "than" "two")) "strings")
(test-equal? "test 4" (longest-string '("a" "list" "of" "like" "twenty" "strings" "or" "just" "longer" "than" "two" "longest-string")) "longest-string")
(test-equal? "test 5" (longest-string '("longest-string" "a" "list" "of" "like" "twenty" "strings" "or" "just" "longer" "than" "two")) "longest-string")
(define long-list (map (section make-string <> #\a)
(range 1 30)))
We will continue partners and computers and lab on Monday.
Think of the second set of calls to acc-range as a trace.
(acc-range 4 '())
--> (acc-range 3 '(4))
--> (acc-range 2 '(3 4))
--> (acc-range 1 '(2 3 4))
--> (acc-range 0 '(1 2 3 4))
'(1 2 3 4)
What happens to the first parameter to acc-range at each step?
What happens to the second parameter to acc-range at each step?