【问题标题】:Difficulty understanding logic of the implemented algorithm - C#难以理解实现算法的逻辑 - C#
【发布时间】:2021-02-03 15:03:23
【问题描述】:

我发现很难理解以下输出 8,8 的算法的逻辑。如果您能提供一些见解,我将不胜感激。

using System;

namespace Console_Example
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(g(4) + g(5) + "," + g(6));
            Console.ReadKey();
        }
        static int g(int k)
        {
            if ((k == 1) || (k == 2))

                return 1;
            else

                return g(k - 1) + g(k - 2);
        }
    }
}

【问题讨论】:

  • jusz 调试函数,你会发现自己。无论如何,你的问题有一个 horrible 的标题。它应该包含相关信息。
  • 你希望代码做什么?
  • 写下你期望它的行为,调试它,并将它的行为与你认为应该做的比较。此外,从更简单的函数调用开始(传递小数字,如 1、2、3、4)
  • 8,8 是正确的(在纸上调试)
  • 看起来像斐波那契数列实现

标签: c# integer


【解决方案1】:

只是一个递归函数。您必须遵循所有步骤。

如果 k = 1: 返回 1;

如果 k = 2: 返回 1;

如果 k = 3: 返回 (g(2) + g(1)) 结果为:1 + 1 = 2

如果 k = 4: 返回 (g(3) + g(2)) 结果为:(1 + 1) + 1 = 3

如果 k = 5: 返回 (g(4) + g(3)) 结果为:5 + 3 = 5

如果 k = 6: 返回 (g(5) + g(4)) 结果为:5 + 3 = 8

【讨论】:

    【解决方案2】:

    这看起来与Fibonacci sequence (wikipedia) 非常相似,其中每个数字都是前两个数字的总和。

    因为是递归函数,看return g(k - 1) + g(k - 2);调用自己的地方,一定要跟着所有的递归,直到结束。

    • g(1): 1 -- 因为返回1;
    • g(2): 1 -- 因为返回1;
    • g(3): g(2) + g(1) = 1 + 1 = 2 -- 这里开始递归
    • g(4): g(3) + g(2) = 2 + 1 = 3
    • g(5): g(4) + g(3) = 3 + 2 = 5
    • g(6): g(5) + g(4) = 5 + 3 = 8

    所以g(4) + g(5) +"," +g(6) 将是:

    3 + 5 , 8 = 8, 8

    几乎是 F4 F5 的总和得出 F6 的值。

    斐波那契数列的更好实现是

    static int Fibonacci(int k)
    {
        if(k < 0) 
            throw new ArgumentException("Fibonnaci works with numbers >= 0");
    
        if (k == 0 || k == 1)
            return k;
        else                
            return Fibonacci(k - 1) + Fibonacci(k - 2);
    }
    

    【讨论】:

      猜你喜欢
      • 2010-10-28
      • 1970-01-01
      • 2015-07-25
      • 2014-12-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-02
      相关资源
      最近更新 更多