home *** CD-ROM | disk | FTP | other *** search
/ Power-Programmierung / CD1.mdf / forth / compiler / fpc / tutor / l5p050 < prev    next >
Text File  |  1990-07-15  |  4KB  |  110 lines

  1.        ╔════════════════════════════════════════════════════╗
  2.        ║ Lesson 5 Part 050  F-PC 3.5 Tutorial by Jack Brown ║
  3.        ╚════════════════════════════════════════════════════╝
  4.  
  5.             ┌──────────────────────────────┐
  6.             │  An Indefinite Loop Example  │
  7.             └──────────────────────────────┘
  8.  
  9. We are going to write a program using an indefinite loop that
  10. demonstrates the incredible integer property.  The algorithm below
  11. originally appeared in the January 1984 Scientific American
  12. Computer Recreations column.  It also appeared more recently in
  13. Algorithm - The Personal Programming Newsletter, Nov/Dec 1989 Vol 1.1.
  14.  
  15.  
  16. Step 1: choose any integer larger than 2, call it n
  17. Step 2: if n is odd, replace n by 3n + 1 ; goto step 4
  18. Step 3: if n is even, replace n by n/2
  19. Step 4: if n less than 2 go to step 5 otherwise go to step 2
  20. Step 5: stop.
  21.  
  22. On reading the above algorithm you will soon discover that you cannot
  23. tell just how many loops will occur before you get to step 5.  At first
  24. glance it appears that you would never get to step 5 and stop as half of
  25. the time, when n is odd, you are more than tripling n and the other half
  26. of the time when n is even you are just halfing n. To experiment with
  27. this algorithm we can use Forth indefinite loop structure to construct a
  28. program.
  29.  
  30. \ Indefinite loop illustrating the incredible integer property.
  31. : DOIT  ( n   -- )
  32.     CR  BEGIN  DUP  2 MOD  ( is n odd? )
  33.                IF   3 * 1+ ( yes: tripple n and add 1 )
  34.                ELSE   2/   ( no:  half n )
  35.                THEN
  36.                #OUT @ 65 > ( check for end of line )
  37.                IF CR THEN  ( if there start new line )
  38.                DUP 5 .R    ( display current value of n )
  39.                DUP 2 <     ( continue until less than 2 )
  40.         UNTIL  DROP ;
  41. 5 DOIT
  42.    16    8    4    2    1 ok
  43. 7 DOIT
  44.    22   11   34   17   52   26   13   40   20   10    5   16    8    4
  45.     2    1 ok
  46.  
  47. Exercise 5.3
  48. What input n less than 100 will climb the highest ( the largest number
  49. in the genterated sequence)?
  50. What input n less than 100 will produce the maximum number of cycles
  51. or loops before terminating?
  52.  
  53. ╓─────────────╖
  54. ║ Problem 5.5 ║
  55. ╙─────────────╜
  56. Modify program to count the number of cycles before termination.  Will
  57. this program always end? Hint: Use a variable to save the count.
  58.  
  59. ╓──────────────╖
  60. ║ Problem 5.6  ║
  61. ╙──────────────╜
  62. Modify the program again so the value of the largest number encountered
  63. is printed when the program terminates. Is there a limit to the maximum
  64. number? Are 16 bit numbers large enough.  Hint: Use a variable to save
  65. current maximum.
  66.  
  67. ╓─────────────╖
  68. ║ Problem 5.7 ║
  69. ╙─────────────╜
  70. Construct a new version of your solution to problem 5.6 that uses double
  71. numbers.  While your at it why not look in the file DMATH.SEQ which was
  72. provided or get it from TANG.ZIP and write a quad number version.
  73.  
  74. ╓──────────────╖
  75. ║ Problem 5.8  ║
  76. ╙──────────────╜
  77. Automate you testing by calling DOIT from within another loop and have
  78. it save the value of n that cycles the longest and the value of n that
  79. climbs the highest.
  80.  
  81. The BEGIN ... WHILE ... REPEAT ... Indefinite Loop.
  82.      ... (step1)  BEGIN  (step2)
  83.                          (condition)
  84.                   WHILE  (step3)
  85.                   REPEAT (step4) ...
  86. : COUNTUP ( -- )
  87.           0                      \ step 1
  88.           BEGIN  1+              \ step 2
  89.                  KEY? NOT        \ condition
  90.           WHILE  DUP CR .        \ step 3
  91.           REPEAT DROP ." DONE" ; \ step 4
  92.  
  93. Step 1: is executed once.
  94. Step 2: is executed once for each loop.
  95. Step 3: is executed if condition is true and then go to step 2.
  96. Step 4: is executed if condition is false.
  97.  
  98. \ This word clears the data stack.
  99. : CLEAR ( ??   -- )
  100.         BEGIN   DEPTH
  101.                 0<>
  102.         WHILE   DROP
  103.         REPEAT        ;
  104. \ And this one clears the data stack too.
  105. : CLEAR ( ??   -- )  SP0 @ SP! ;
  106.  
  107. ┌─────────────────────────────────────┐
  108. │   Please Move to Lesson 5 Part 060  │
  109. └─────────────────────────────────────┘
  110.