Как работает оператор case в функции?

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

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 ответ

Решение

Это 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

Другие вопросы по тегам