Home > Software engineering >  What is the purpose of b<-c() in this code?
What is the purpose of b<-c() in this code?

Time:10-17

I have written a code to find a positive integer that has more divisors than any smaller positive integer has. My code is right but I noticed that I wrote a step only because I had solved other questions similarly but I don't really understand the intuition of why we write this particular line:

b<-c()

Also, why is there a "b" in c(b, sum..) as in the below line:

 b <- c(b,sum(p%%c(1:p)== 0))

Here is the full code:

code <- function(n){
  if (n<1 | n%%1!=0)
    print("Only positive integers allowed")
  else if (n <= 2) 
    return(TRUE) 
  else{
    a <- sum(n%%c(1:n) == 0) 
    b<-c()
    for (p in 1:(n-1)) {                       
      b <- c(b,sum(p%%c(1:p)== 0))
    }
    return(max(b) < a) 
  }
}

code(8)
code(6)
code(-7)

CodePudding user response:

As already explained in comments the purpose of b<-c() is to initialise an empty vector and fill it in the loop. Also the reason why you are using b <- c(b,sum(p%%c(1:p)== 0)) is to append new values to already existing values of b.

For example,

b <- c()
b
#NULL
b <- c(b, 1)
b
#[1] 1
b <- c(b, 2)
b
#[1] 1 2

Usually, it is not a good practice to grow an object in a loop, it is highly inefficient to do that. If the size of output is fixed you can initialise a vector with fixed size and then fill it in the loop.

code <- function(n){
  if (n<1 | n%%1!=0)
    print("Only positive integers allowed")
  else if (n <= 2) 
    return(TRUE) 
  else{
    a <- sum(n%%c(1:n) == 0) 
    b <- integer(n-1) #Creates a vector with 0's of length n-1
    for (p in 1:(n-1)) {                       
      b[p] <- sum(p%%c(1:p)== 0)
    }
    return(max(b) < a) 
  }
}

Or in this case you can save only the max value of b since all other values are not important.

code <- function(n){
  if (n<1 | n%%1!=0)
    print("Only positive integers allowed")
  else if (n <= 2) 
    return(TRUE) 
  else{
    a <- sum(n%%c(1:n) == 0) 
    max_b <- 0
    for (p in 1:(n-1)) {                       
       val <- sum(p%%c(1:p)== 0)
       if(val > max_b) max_b <- val
    }
    return(max_b < a) 
  }
}
  •  Tags:  
  • r
  • Related