fork(1) download
  1. using System;
  2. using System.Collections.Generic;
  3.  
  4. class App
  5. {
  6. static public void Main(string[] args)
  7. {
  8. const int N = 6;
  9.  
  10. // 素朴にループで
  11. Console.WriteLine(Fact1(N));
  12.  
  13. // 素朴に再帰で
  14. Console.WriteLine(Fact2(N));
  15.  
  16. // コールスタックを自前で用意して再帰っぽく
  17. Console.WriteLine(Fact3(N));
  18. }
  19.  
  20. // 素朴にループ
  21. static int Fact1(int n)
  22. {
  23. int prod = 1;
  24. for (int i = 0; i < n; i++)
  25. {
  26. prod *= (i + 1);
  27. }
  28. return prod;
  29. }
  30.  
  31. // 素朴に再帰
  32. static int Fact2(int n)
  33. {
  34. if (n == 0) return 1;
  35. return n * Fact2(n - 1);
  36. }
  37.  
  38. // コールスタックに積まれる情報
  39. class Frame
  40. {
  41. public int Arg { get; set; }
  42. public int Ret { get; set; }
  43. public Frame(int arg) { Arg = arg; }
  44. }
  45.  
  46. // C#が提供するコールスタックを使わず
  47. // スタックを自前で用意
  48. static int Fact3(int n)
  49. {
  50. // なんちゃってコールスタック
  51. Stack<Frame> frames = new Stack<Frame>();
  52.  
  53. Frame f = new Frame(n);
  54. while(true)
  55. {
  56. if (f.Arg == 0)
  57. {
  58. // 再帰の出口
  59. f.Ret = 1;
  60. break;
  61. }
  62. else
  63. {
  64. // 再帰呼び出し
  65. frames.Push(f);
  66. f = new Frame(f.Arg - 1);
  67. }
  68. }
  69.  
  70. // 残りの掛け算
  71. while (0 < frames.Count)
  72. {
  73. Frame peek = frames.Peek();
  74. peek.Ret = f.Ret * peek.Arg;
  75. f = frames.Pop();
  76. }
  77. return f.Ret;
  78. }
  79. }
  80.  
Success #stdin #stdout 0.03s 33912KB
stdin
Standard input is empty
stdout
720
720
720