-
Notifications
You must be signed in to change notification settings - Fork 0
/
hw5-iteration.Rmd
139 lines (98 loc) · 7.02 KB
/
hw5-iteration.Rmd
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
---
title: "Homework 5 - Iteration"
output:
html_document:
toc: false
number_sections: false
params:
number: 5
submit: "https://u.pcloud.com/#page=puplink&code=JVYkZ6sj8LeB6pS0341Ma0nTAvJ7trAmy"
purpose: |
The purposes of this assignment are:
>
> - To practice using for and while loops in R.
> - To practice computational problem solving with loops.
---
```{r child = file.path("child", "setup.Rmd")}
```
```{r child = file.path("child", "hw.Rmd")}
```
> ### Using the [autograder](autograder.html)
>
> - You can check your solutions to problems 2 - 6 by logging into the [autograder](autograder.html) and uploading your `hw5.R` file.
> - **The file must be named `hw5.R` or it won't work.**
> - Your user name is your netID, and your password is inside the `readme.txt` file in the Box folder I shared with you.
### 1) Staying organized [SOLO, 5%]
Download and use [this template](templates/hw5.zip) for your assignment. Inside the "hw5" folder, open and edit the R script called "hw5.R" and fill out your name, Net ID, and the names of anyone you worked with on this assignment.
> ### **Writing test functions**
>
> For each of the following functions, write a test function first, and then write the function. **Your test functions will count for half of the available credit for each problem**. Think carefully about the test cases to include in your test functions.
> ### **Using good style**
>
> For this assignment, you must use good style to receive full credit. Follow the best practices described in [this style guide](http://adv-r.had.co.nz/Style.html).
### 2) `loopFactorial(n)` [SOLO, 10%]
Use a `for` loop to write the function `loopFactorial(n)` that should return `n!`, i.e. "n factorial", which is defined for all non-negative integers. For example, `3! = 3*2*1 = 6`, `4! = 4*3*2*1 = 24`, and `5! = 5*4*3*2*1 = 120`. Note that `0` is a special case, and `0! = 1`. Assume `n >= 0`.
### 3) `numDigits(n)` [SOLO, 15%]
Write the function `numDigits(n)` that takes a _possibly-negative_ integer and returns the number of digits in it. So, `numDigits(12345)` returns `5`, `numDigits(0)` returns `1`, and `numDigits(-111)` returns `3`. One way you could solve this is to convert `n` to a string and use `str_length()`, but you cannot do that since you may not use strings here.
## Happy Numbers [COLLABORATIVE]
**Background**: Read the first paragraph from the [Wikipedia page](https://en.wikipedia.org/wiki/Happy_number) on happy numbers. After some thought, we see that no matter what number we start with, when we keep replacing the number by the sum of the squares of its digits, we'll always either arrive at 4 (unhappy) or at 1 (happy). With that in mind, we want to write the function `nthHappyNumber(n)`. However, to write that function, we'll first need to write `isHappyNumber(n)`, which determines whether a number is "happy" or not. And to right that function, we'll first need to write `sumOfSquaresOfDigits(n)`. And that's top-down design! Here we go...
## 4) `sumOfSquaresOfDigits(n)` [10%]
Write the function `sumOfSquaresOfDigits(n)` which takes a non-negative integer, `n`, and returns the sum of the squares of its digits (assume that `n` will always be a positive integer, so no need to check for bad inputs).
## 5) `isHappyNumber(n)` [10%]
Write the function `isHappyNumber(n)` which takes a _possibly-negative_ integer and returns `TRUE` if it is happy and `FALSE` otherwise. Note that all numbers less than 1 are not happy.
## 6) `nthHappyNumber(n)` [15%]
Write the function `nthHappyNumber(n)` which takes a non-negative integer, `n`, and returns the nth happy number, where nthHappyNumber(1) returns the first happy number (1).
## Turtle loops! [COLLABORATIVE]
(_Note: the autograder won't test these functions_)
## 7) `turtleSquare(s)` _redux_ [10%]
Re-write the `turtleSquare(s)` function from [HW2](hw2-functions.html), but this time use a `for` loop to draw the sides of the square. The following code should produce a square with a side length of 50:
```{r, eval=FALSE}
library(TurtleGraphics)
turtle_init()
turtle_do({
turtleSquare(50)
})
```
<center>
<img src="images/turtle_square.png" width=456>
</center>
## 8) `concentricTurtleSquares(spacing = 5)` [15%]
Write the function `concentricTurtleSquares(spacing)` that uses the `TurtleGraphics` package to draw concentric squares from the center of the terrarium and outward. The `spacing` argument determines the spacing between each square, and the default value should be `spacing = 5`. Also, `spacing >= 1`, and your function must not allow the turtle to escape the terrarium. Hint: you may want to use `turtleSquare(s)` as a helper function. The following code should produce concentric squares with a spacing of 5:
```{r, eval=FALSE}
library(TurtleGraphics)
turtle_init()
turtle_do({
concentricTurtleSquares(5)
})
```
<center>
<img src="images/turtle_concentricSquares.png" width=456>
</center>
### 9) Read and reflect [SOLO, 10%]
Read and reflect on next week's readings on [vectors](r6-vectors.html). Afterwards, in a comment (`#`) in your R file, write a short reflection on what you've learned and any questions or points of confusion you have about what we've covered thus far. This can just few a few sentences related to this assignment, next week's readings, things going on in the world that remind you something from class, etc. If there's anything that jumped out at you, write it down.
---
(_Note: the autograder won't test these functions_)
### Bonus 1) `turtleSquareRotated(s, degrees)` [SOLO, 3%]
Write the function `turtleSquareRotated(s, degrees)` that uses the `TurtleGraphics` package to draw a square with side length `s < 100` and rotated by `degrees <= 180` counterclockwise from the horizontal plane. The rotated square should be centered in the turtle's terrarium. Hint: you're going to need to use the cosine (`cos()`) and sine (`sin()`) functions; in R, these functions take angles in **radians** (not degrees), so remember to convert your angles (180 degrees = $\pi$). The following code should produce a square with a side length of 30 and rotated by 30 degrees:
```{r, eval=FALSE}
library(TurtleGraphics)
turtle_init()
turtle_do({
turtleSquareRotated(30, 30)
})
```
<center>
<img src="images/turtle_squareRotated.png" width=456>
</center>
### Bonus 2) `turtleSquareStar(s, degreeSpacing = 20)` [SOLO, 3%]
Write the function `turtleSquareStar(s, degreeSpacing)` that uses the `turtleSquareRotated(s, degrees)` as a helper function to draw a sequence of overlapping rotated squares with side length `s < 70` to form a star. The `degreeSpacing` argument determines the spacing in degrees between each rotated square, and the default value should be `degreeSpacing = 20`. Also, `1 <= degreeSpacing <= 60`, and your function must not allow the turtle to escape the terrarium. The following code should produce the star of rotated squares with a side length of 50 and 20 degree spacings between each square:
```{r, eval=FALSE}
library(TurtleGraphics)
turtle_init()
turtle_do({
turtleSquareStar(50, 20)
})
```
<center>
<img src="images/turtle_squareStar.png" width=456>
</center>