Как работает оператор case в функции? - PullRequest
0 голосов
/ 06 июня 2018

У меня есть следующий код рубина:

def xyz(n)
  case n
  when 0
    0
  when 1
    1
  else
    xyz(n - 1) + xyz(n - 2)
  end
end

puts xyz(ARGF.gets.to_i)

Я выполнил код как:

Ruby$ echo "4" | ruby test.rb

Я хочу знать, как ответ становится 3.Я не понимаю:

xyz(n - 1) + xyz(n - 2)

часть кода.Пожалуйста, объясните.

1 Ответ

0 голосов
/ 06 июня 2018

Это recursive функция, вызывающая функцию по itself

Вот различные steps of the function execution и output для каждого шага:

Шаг1:

def xyz(n)
    n = 4.
    case n
    when 0
        0
    when 1
        1
    else
        n = 4, so it comes here and calls
        xyz(n - 1) + xyz(n - 2)
        xyz(3) + xyz(2) // no result
    end
end

Нет o / p, поскольку оба условия делают рекурсивный вызов


Шаг 2:

def xyz(n)
    n = 3.
    case n
    when 0
        0
    when 1
        1
    else
        n = 3, so it comes here and calls
        xyz(n - 1) + xyz(n - 2)
        xyz(2) + xyz(1) // recursion stops here as case 1 is 1 // so o/p is 1 for hjere
    end
end

o / p равно единице, поскольку xyz (1) будет исполняться до 1. Текущее значение O / p: 1 Общее O / p: 1


Шаг 3:

def xyz(n)
    n = 2.
    case n
    when 0
        0
    when 1
        1
    else
        n = 2, so it comes here and calls
        xyz(n - 1) + xyz(n - 2)
        xyz(1) + xyz(0) // 1
    end
end

Здесь o / p снова равен 1, поскольку xyz(1) выполнится до 1, Текущее значение O / p: 1 Общее значение O / p: 1+ 1 ==> 2


Шаг 4:

def xyz(n)
    n = 2.
    case n
    when 0
        0
    when 1
        1 // 1
    else
        n = 1, I wont come here
        xyz(n - 1) + xyz(n - 2)
    end
end

Здесь o / p снова равно 1, поскольку case 1выполнится до 1, текущий O / p: 1 Общий O / p: 1 + 1 + 1 ==> 3


Итак, конечный результат равен 3

...