Как работает рекурсия в ruby? - PullRequest
0 голосов
/ 30 мая 2018

У меня есть этот метод, который меняет цифру 5 на 7.

def switch_digit(num)
   if num <= 0
     return 0
   end

  digit = num % 10

  if (digit == 5) 
    digit = 7
  end

  return switch_digit(num/10) * 10 + digit
end

switch_digit(5952)

Может кто-нибудь объяснить, почему, когда метод достигает базового случая, он не возвращает 0?

Как на самом деле работает этот рекурсивный метод?Добавляет ли возвращаемую цифру следующую цифру?

Ответы [ 2 ]

0 голосов
/ 30 мая 2018

Я добавил небольшое изменение в ваш код, чтобы знать, что он работает.

Наконец, я также ожидал, что значение метода было 0, но это не так.Конец достигнут, но возвращаемое значение не равно 0. Почему?

def switch_digit(num, array)
  if num <= 0
    array << num
    p array
    puts "The end"
    return 0
  end
  digit = num % 10
  array << [digit, num]
  if (digit == 5) 
    digit = 7
  end
  return p switch_digit(num/10, array) * 10 + digit
end

p "returned value = " + switch_digit(123456789, Array.new).to_s

Какие выходы:

#=> [[9, 123456789], [8, 12345678], [7, 1234567], [6, 123456], [5, 12345], [4, 1234], [3, 123], [2, 12], [1, 1], 0]
#=> The end
#=> 1
#=> 12
#=> 123
#=> 1234
#=> 12347
#=> 123476
#=> 1234767
#=> 12347678
#=> 123476789
#=> "returned value = 123476789"
0 голосов
/ 30 мая 2018

Базовый случай возвращает 0, но результат в целом определяется с помощью return switch_digit(num/10) * 10 + digit

. Выполните код, используя меньший пример, например switch_digit(15):

num <= 0 # no
digit = num % 10 # 5
digit == 5 # yep, so swap it for a 7

return switch_digit(num/10) * 10 + 7

num/10 равно 1, так что для рекурсивного switch_digit(1) оценивается?

num <= 0 # no
digit = num % 10 # 1
digit == 1 # so leave it unchanged
return switch_digit(num/10) * 10 + 1 

num/10 равно 0, поэтому сейчас мы достигли базового варианта

switch_digit(15) == switch_digit(1) * 10 + 7
switch_digit(1) == switch_digit(0) * 10 + 1
switch_digit(0) == 0 # the base case

работа в резервном режиме, добавление значений из нижних результатов:

switch_digit(1) == 0 * 10 + 1  == 1
switch_digit(15) == 1 * 10 + 7 == 17

Я бы также добавил, что в Ruby нет ничего конкретного о том, как здесь обрабатывается рекурсия.Любые другие описания рекурсии или классический пример, такой как рекурсивная факториальная функция , должны помочь вам лучше понять.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...