用递归算法从1到9(可以重复)选出9个数相加为45,并将其打印出来不能用循环的方法
using System;
using System.Collections.Generic;using System.Text;using CustomLib;
namespace ConTest
{ class TestMain { public static void Main(string[]args) { int[] mems = new int[COUNTMEMBERS]; RegResult(mems, level); Console.Read(); } private static int COUNTMEMBERS = 9; private static int MINVALUE = 1; private static int MAXVALUE = 9; private static int VALUE = 45; private static int level = 0; private static void RegResult(int[]mems,int level) {for (int i = MINVALUE; i <= MAXVALUE; i++)
{ mems[level] = i;if (level == COUNTMEMBERS - 1)
{if (IsEqualValue(mems))
DisplayDatas(mems);}
else//RegResult(mems,++level );//注意这里,哥就因为这设置为++level,几乎耗了我半天 ,我不断的怀疑我的逻辑,找来找去,真蛋疼,就是找不出原因,现终于水落石出,一身松。
RegResult(mems, level+1); } }
//验证是否符合条件
private static bool IsEqualValue(int[] mems)
{int sum = 0;
for (int i = 0; i < mems.Length;i++ ) { sum += mems[i]; } return sum == VALUE; }//将符合条件的数组打印出来
private static void DisplayDatas(int[]datas)
{Console.Write("Datas:\t");
foreach (int i in datas)
{Console.Write(i + " ");
} Console.WriteLine("Total:" + VALUE.ToString()); } }}
优化代码:
using System;
using System.Collections.Generic;using System.Text;using CustomLib;
namespace ConTest
{ class TestMain { public static void Main(string[]args) { int total = 0; int level = 0; int[] mems = new int[COUNTMEMBERS]; RegResult(mems, level,total); Console.Read(); } private static int COUNTMEMBERS = 9; private static int MINVALUE = 1; private static int MAXVALUE = 9; private static int VALUE = 72; private static int level = 0; private static void RegResult(int[]mems,int level,int total) {for (int i = MINVALUE; i <= MAXVALUE; i++)
{ mems[level] = i; total = total + i;if (level == COUNTMEMBERS - 1)
{if (total == VALUE)
DisplayDatas(mems, total);}
else { RegResult(mems, level+1,total); }total = total - i;//这句必须要加上
} }private static bool IsEqualValue(int[] mems)
{int sum = 0;
for (int i = 0; i < mems.Length;i++ ) { sum += mems[i]; } return sum == VALUE; }private static void DisplayDatas(int[]datas,int total)
{ Console.Write("Datas:\t");foreach (int i in datas)
{Console.Write(i + " ");
} Console.WriteLine("Total:" + total.ToString()); } }}
//循环算法与递归算法的比较
private static int COUNTMEMBERS = 9;
private static int MINVALUE = 1; private static int MAXVALUE = 9; private static int VALUE = 45; private static int level = 0; private static int[] mems = new int[COUNTMEMBERS]; //循环算法的设计,虽然下面的循环代码也能实现同样的功能,但是随着层数的增多,这些代码就会臭名昭著,一滩死水,我看了都呕吐 private static void LoopResult() { for (int i = MINVALUE; i <= MAXVALUE; i++) { mems[0] = i; for (int j = MINVALUE; j <= MAXVALUE; j++) { mems[1] = j; for (int k = MINVALUE; k <= MAXVALUE; k++) { mems[2] = k; for (int l = MINVALUE; l <= MAXVALUE; l++) { mems[3] = l; for (int m = MINVALUE; m <= MAXVALUE; m++) { mems[4] = m; for (int n = MINVALUE; n <= MAXVALUE; n++) { mems[5] = n; for (int o = MINVALUE; o <= MAXVALUE; o++) { mems[6] = o; for (int p = MINVALUE; p <= MAXVALUE; p++) { mems[7] = p; for (int q = MINVALUE; q <= MAXVALUE; q++) { mems[8] = q; int sum = 0; foreach (int item in mems) { sum += item; } if (sum == VALUE) { for (int a = 0; a < mems.Length; a++) { Console.Write(mems[a] + "\t"); } } } } } } } } } } }} //递归循环的设计,多优雅,多简洁,值得推荐
private static void RegResult(int[]mems,int level,int total)
{for (int i = MINVALUE; i <= MAXVALUE; i++)
{ mems[level] = i; total = total + i;if (level == COUNTMEMBERS - 1)
{if (total == VALUE)
DisplayDatas(mems, total); } else RegResult(mems, level+1,total);total = total - i;
} }//将符合条件的打印出来
private static void DisplayDatas(int[]datas,int total)
{Console.Write("Datas:\t");
foreach (int i in datas)
{Console.Write(i + " ");
} Console.WriteLine("Total:" + total.ToString()); }
public static void Main(string[]args)
{ int total = 0; // int level = 0; //递归算法的调用 RegResult(mems, level,total); //循环算法的调用 LoopResult(); Console.Read(); }