第4章の練習,投票


再帰による反復計算の定義---再帰による和の定義

def sum(n)
  if n>=2
    sum(n-1)+n
  else
    1
  end
end

約数の和

def divisible(x,y)
  x%y==0
end
def sod(k,n)
  if n>=2
    if divisible(k,n)
      sod(k,n-1)+n
    else
      sod(k,n-1)
    end
  else
    1
  end
end

条件を満たす値を探す

load("./divisible.rb")
def gd(k,n)
  if divisible(k,n)
    n
  else
    gd(k,n-1)
  end
end
irb(main):037:0* gd(20,19)
=> 10
irb(main):038:0> gd(100,99)
=> 50
irb(main):039:0> gd(9,8)
=> 3

練習


次の結果は何?

def fact(n)
  if n==1
    1
  else
    n*fact(n-1)
  end
end
irb(main):012:0> fact(50)
  1. 0
  2. 100
  3. 3628800
  4. 2432902008176640000
  5. 30414093201713378043612608166064768844377641568960512000000000000

繰り返しによる和の定義

def sum_loop(n)
  s=0
  for i in 1..n
    s=s+i
  end
  s
end
irb(main):015:0> sum_loop(3)
=> 6
irb(main):016:0> sum_loop(10)
=> 55

条件を満たす値を探す繰り返し

load("./divisible.rb")
def gd_loop(k,n)
  while !divisible(k,n)
    n=n-1
  end
  n
end
irb(main):035:0> gd_loop(20,19)
=> 10
irb(main):036:0> gd_loop(100,99)
=> 50
irb(main):037:0> gd_loop(9,8)
=> 3

配列と繰り返しを使った組み合わせ数の計算

def make1d(w)
  a=Array.new(w)
  for i in 0..(w-1)
    a[i]=0
  end
  a
end
def make2d(h,w)
  a=Array.new(h)
  for i in 0..(h-1)
    a[i]=make1d(w)
  end
  a
end
def combination_loop(n,k)
  c=make2d(n+1,n+1)
  for i in 0..n
    c[i][0]=1
    for j in 1..(i-1)
      c[i][j]=c[i-1][j-1]+c[i-1][j]
    end
    c[i][i]=1
  end
  c[n][k]
end
irb(main):062:0> combination_loop(5,2)
=> 10
irb(main):063:0> combination_loop(10,5)
=> 252
 

次の結果は何?

irb(main):001:0> combination_loop(40,32)
  1. 40
  2. 91390
  3. 76904685
  4. 137846538820
  5. 12641060643775


言葉探し

def match(s,p)
  i=0
  w=p.length()
  while submatch(s,i,p,w)< w
    i=i+1
  end
  i
end
def submatch(s,i,p,w)
  j=0
  while j< w && s[(i+j)..(i+j)]==p[j..j]
    j=j+1
  end
  j
end
irb(main):031:0> submatch("balalaika",1,"alai",4)
=> 3
irb(main):032:0> submatch("balalaika",3,"alai",4)
=> 4
irb(main):042:0> match("balalaika","alai")
=> 3

次の結果は何?

irb(main):001:0> submatch("akaiakaiaka",4,"aka",3)
  1. 0
  2. 1
  3. 2
  4. 3
  5. 4


次の結果は何?

irb(main):001:0> match("makkanaaka","aka")
  1. 0
  2. 1
  3. 7
  4. ""
  5. nil