#! /usr/local/bin/ruby def hanoi1(n, a, b, c, &block) return if n.zero? hanoi1(n-1, a, c, b, &block) yield a, b hanoi1(n-1, c, b, a, &block) end def hanoi(n, &block) block_given? or return to_enum(:hanoi, n) hanoi1(n, "a", "b", "c", &block) end hanoi(7) { |from, to| puts "#{from} => #{to}" }