University stuff.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

oppgave.scm 2.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. ;;;;;;;
  2. ;; 1 ;;
  3. ;;;;;;;
  4. ;; A: 30
  5. ;; (4 + 2) * 5 er 30.
  6. ;; B: application: not a procedure;
  7. ;; Her prøver vi å kalle på 5 som en prosedyre med (5),
  8. ;; men 5 er ikke en prosedyre.
  9. ;; C: application: not a procedure;
  10. ;; Her prøver vi å kalle på 4 som en prosedyre med (4 + 5),
  11. ;; men 4 er ikke en prosedyre.
  12. ;; D: 21
  13. ;; Vi definerer et symbol kalt bar på linje 1, og gir den verdien
  14. ;; (/ 42 2), som er 21. Linje 2 sin bar evalueres til verdien til bar,
  15. ;; altså 21.
  16. ;; E: 10
  17. ;; bar er allerede definert som 21. 21 - 11 = 10.
  18. ;; F: 12
  19. ;; (21 * 3 * 4 * 1) / 21 er 12.
  20. ;;;;;;;
  21. ;; 2 ;;
  22. ;;;;;;;
  23. ;; A
  24. ;; "or" evaluerer bare frem til den første verdien som ikke er #f.
  25. ;; Siden "piff!" ikke er #f, evalueres hverken "paff!" eller (zero? (1 - 1)),
  26. ;; så det spiller ingen rolle at (zero? (1 - 1)) ikke kan evalueres.
  27. ;; "and" evaluerer bare frem til den første verdien som er #f.
  28. ;; Siden (= 1 2) er #f, evalueres hverken "piff!", "paff!" eller
  29. ;; (zero? (1 - 1)), så det spiller ingen rolle at (zero? (1 - 1)) ikke
  30. ;; kan evalueres.
  31. ;; "if" evaluerer bare det andre uttrykket hvis det første ikke er #f,
  32. ;; og evaluerer bare det tredje uttrykket hvis det første er #f.
  33. ;; Siden (positive? 42) er #t, evalueres bare "poff!", ikke
  34. ;; (i-am-undefined).
  35. ;; B
  36. ;; Med if:
  37. (define (sign x)
  38. (if (negative? x) -1
  39. (if (positive? x) 1 0)))
  40. ;; Med cond:
  41. (define (sign x)
  42. (cond ((> x 0) 1)
  43. ((< x 0) -1)
  44. ((= x 0) 0)))
  45. ;; C
  46. ;; Med and og or:
  47. (define (sign x)
  48. (or (and (> x 0) 1)
  49. (and (< x 0) -1)
  50. 0))
  51. ;;;;;;;
  52. ;; 3 ;;
  53. ;;;;;;;
  54. ;; A
  55. (define (add1 x) (+ x 1))
  56. (define (sub1 x) (- x 1))
  57. ;; B
  58. (define (plus a b)
  59. (if (zero? b) a
  60. (plus (add1 a) (sub1 b))))
  61. ;; C
  62. ;; Prosedyren gir opphav til en iterativ prosess. Dette er fordi
  63. ;; det siste som skjer i prosedyren er at den kaller på seg selv.
  64. ;; Prosedyren hadde vært rekursiv hvis prosedyren hadde brukt resultatet
  65. ;; av å kalle seg selv til noe.
  66. ;; Her har vi en rekursiv definisjon av plus:
  67. (define (plus-rekursiv a b)
  68. (if (zero? b) a
  69. (add1 (plus-rekursiv a (sub1 b)))))
  70. ;; D
  71. ;; Dette er forenklet ved å la power-iter bruke variablene b og n fra
  72. ;; power-close-to, istedenfor å ta variablene som argumenter.
  73. ;; Jeg har også kalt iteratorfunksjonen iter, siden den er lokal.
  74. (define (power-close-to b n)
  75. (define (iter e)
  76. (if (> (expt b e) n)
  77. e
  78. (iter b n (+ 1 e))))
  79. (iter 1))
  80. ;; E
  81. ;; Det er ikke mulig å forenkle fib-iter. Selv om fib-iter kalles med
  82. ;; fib sin n, kan vi ikke bruke den i fib-iter, fordi vi trekker fra 1
  83. ;; for hver iterasjon, noe som krever at vi gir det som et argument.