递归并没有做它应该做的事情

时间:2016-07-09 13:35:37

标签: c# recursion

我有一个函数,它接受一个整数值,并返回一个[i / 2,i / 3,i / 4]的列表。我!= 0.我还有一个递归,它应该计算函数(i)由于达到0而无法达到0.然后,我计算列表中有多少个零并输出它。

C#:

library(randomForest) 

rf <- randomForest(train, train_label,importance=TRUE,proximity=TRUE)
prediction<-predict(rf, test, type="prob")

7应该返回15 0但它返回6个零。为什么呢?

2 个答案:

答案 0 :(得分:1)

你怎么知道7应该返回15 0?

第一次迭代,您将有3个条目

x1 x2 x3

之后,对于每个条目(3个条目),您最多可以有3个条目

x1 生成 x11 x12 x13
x2 生成 x21 x22 x23
x3 生成 x31 x32 x33

更多9个条目。总计:9 + 3 = 12

如果你最多有12个数字,怎么能有15个?

答案 1 :(得分:1)

让我们逐步完成您的代码

static void Main(string[] args)
    {
        int input = 7;
        int zeroes = 0;

        List<int> myList = ATM(input);
  

mylist =&gt; [3,2,1]

        foreach(var number in myList.ToArray())
        {
            if (number != 0)
            {
                myList.AddRange(ATM(number));
            }
            else
            {
                continue;
            }
  
      
  • 3 mylist =&gt; [3,2,1,1,1,0]
  •   
  • 在2 mylist =&gt;之后[3,2,1,1,1,0,1,0,0]
  •   
  • 1 mylist =&gt;之后[3,2,1,1,1,0,1,0,0,0,0,0]
  •   
        }
  

手工计数零...你看到6个零

        foreach (var zero in myList)
        {
            if (zero == 0)
            {
                zeroes += 1;
            }
        }

        Console.WriteLine(zeroes);
        Console.ReadKey();


        Console.ReadKey();
    }

    static List<int> ATM(int value)
    {
        List<int> exchangeCoins = new List<int>();

        if (value != 0)
        {                                 // 7 3 2 1
            exchangeCoins.Add(value / 2); // 3 1 1 0
            exchangeCoins.Add(value / 3); // 2 1 0 0
            exchangeCoins.Add(value / 4); // 1 0 0 0
        }
       else
        {
            throw new Exception("Value can't be zero!");
        }

        return exchangeCoins;

    }
}

这就是为什么你的代码返回6

如果你的目标是获得15个零,那么你必须设计ATM是递归的:

static void Main( string[ ] args )
{
    int input = int.Parse( Console.ReadLine() );
    int zeroes = 0;

    List<int> myList = ATM( input );

    foreach ( var zero in myList )
    {
        if ( zero == 0 )
        {
            zeroes += 1;
        }
    }

    Console.WriteLine( zeroes );
    Console.ReadKey();


    Console.ReadKey();
}

ATM中的递归呼叫

static List<int> ATM( int value )
{
    List<int> exchangeCoins = new List<int>();

    if ( value != 0 )
    {
        exchangeCoins.Add( value / 2 );
        exchangeCoins.Add( value / 3 );
        exchangeCoins.Add( value / 4 );

        // recursive call on the three items
        foreach ( var item in exchangeCoins.ToArray() )
        {
            exchangeCoins.AddRange( ATM( item ) );
        }
    }

    return exchangeCoins;

}