JavaScriptのarguments.calleeみたいなのはC#でどう書くかなーと。
(メソッドが自分自身を呼ぶには、ということ)
C#3.0以降で書いたこれ↓を基に、C#1.1でやってみる(なぜ1.1)。
【C#】Collatz問題(コラッツ予想・角谷の問題)
これは前回のコード。
CollatzはCollatzの呼び出しを行っている。
using System;
namespace Sample_Collatz2 { class Program { static void Main(string[] args) { decimal seed; decimal.TryParse(Console.ReadLine(), out seed);
Console.WriteLine(); Collatz(seed, n => Console.WriteLine(n)); Main(null); }
static void Collatz(decimal n, Action<decimal> a) { a(n);
if (1 < n) { Collatz(n % 2 == 0 ? n / 2 : n * 3 + 1, a); } } } } |
こっちがC#1.1で書き直したもの。
MethodBase.GetCurrentMethod()で帰ってきたMethodInfoクラスをInvokeすると、たぶん目的のことができてる。
using System; using System.Reflection;
namespace Sample.Callee { class Class1 { [STAThread] static void Main(string[] args) { try { Console.WriteLine(); int i = int.Parse(Console.ReadLine()); Collatz(i, new Action(Display)); } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { //Main(null); MethodBase.GetCurrentMethod().Invoke( null, new object[]{null}); } }
static void Display (object o) { Console.WriteLine(o); }
delegate void Action (object o);
static void Collatz (int n, Action a) { a(n);
if (1 < n) { //Collatz (n % 2 == 0 ? n / 2 : n * 3 + 1, a); MethodBase.GetCurrentMethod().Invoke( null, new object[]{n % 2 == 0 ? n / 2 : n * 3 + 1, a}); } } } } |
0 件のコメント:
コメントを投稿