Help understanding Scheme's syntax, procedures and calls
Fran
franbarlow at mail.com
Thu Aug 12 11:20:12 CEST 2004
I'm trying to understand a functional language code fragment so I can
explain its syntax and workings to my non English-speaking background
neighbour, who is doing her finals.
What in heaven's name is this code fragment intending? (In English
prose if possible).
It looks like a fragment from a language called "scheme"
(define (this n)
(if (=n 0)
0
(= n (this (- n 1)))))
(define (f1 a b)
(if >b a)
0
(+ b (f1 a (+ b 1)))))
(define (that n)
(f1 n1)
a) Describe the processing that occurs during the evaluation of the
expression (this 4)
b) Explain why the expression (=(this n)(that n) always evaluates to
true when n is a positive integer.
c) Write a fragment of code in the above language that adds up all the
integers within a given range, not including the two numbers
specified. For example, if the specified range was 4 à 9 then code
should add 5à 8.
Suggested answers:
a)
This 4 call started
As n-1=3 a recursive This 3 call is started
As n-1=2 a This 2 call starts
As n-1=1 a This 1 call starts
As n-1=0 a This 0 call is started and is returned as n=0
This 1 call is resolved by adding 1+0
This 2 call is resolved by adding 2+1
This 3 call is resolved by adding 3+3
Finally 10 is returned when This 4 call is resolved by adding 4 + 6.
I no more grasp the pattern of the suggested answer than the question,
and am much less in a position to explain it to anyone.
b)
Both the This and the That functions have the same output, and
furthermore both functions result in infinite recursion if n<0. When n
is a positive integer, the This function calculates
(n+
(3+(2+(1+(0)))) and the that function calculates
(1+(2+(3+
(n=(0)))). Both will always result in the same answer. The
list (=a b) only evaluates to true when a=b, as a does equal b the
list always evaluates to true for n>0.
Perhaps this answer will make more sense when I understand the code
fragment.
c)
Solution 1 (without existing functions)
(define (internal-range a b)
(if(>=(+ a 1)b)
0
(+(= a 1)(internal-range(+ a 1)b))))
Solution 2 using existing functions. And assuming a<b
(define (internal-range2 a b)
(-(this b) (this a)b))
Solution 3 using existing functions and dealing with a>b case
(define (internal-range3 a b)
(if (< a b)
(-(this b) (this a)b)
(-(this a) (this b)a)))
What is the role of the "0" character in solution 1 and the initial
fragment? What is the syntax rule being followed by the parentheses?
They note that the code was tested by "Dr Scheme" at
www.plt-scheme.org
Thanks
More information about the Python-list
mailing list