//台阶问题递归解法 C#版
public class Program
{
//总格有N个台阶,单次可以跨1,2,3...M步,求所有方法
static int[] leftSteps = new int[200];//这里设置最大阶数为200
static int caseNumber = 1;//初始方法数为1
/// <summary>
/// 台阶递归函数
/// </summary>
/// <param name="sumLeftSteps">剩余总台阶数</param>
/// <param name="maxOneStep">最大单次可跨台阶数</param>
/// <param name="orders">当前步数</param>
static void Steps(int sumLeftSteps, int maxOneStep, int orders)
{
int thisStep;//当前跨的步数
int thisOrder;//当前是第几步
//递归调用
if (sumLeftSteps > 0)
{
for (thisStep = 1; thisStep <= maxOneStep; thisStep++)
{
leftSteps[orders] = sumLeftSteps - thisStep;
Steps(leftSteps[orders], maxOneStep, orders + 1);
}
}
//输出结果 //小于0的,是超出范围的,直接舍去
else if (sumLeftSteps == 0)
{
Console.Write("Case {0,3}: ", caseNumber++);
for (thisOrder = 1; thisOrder < orders; thisOrder++)
{
Console.Write(leftSteps[thisOrder - 1] - leftSteps[thisOrder]);
}
Console.WriteLine();
}
}
/// <summary>
/// 主函数体
/// </summary>
static void Main()
{
//总台阶数
int allSteps = 10;
//单次最大阶数
int maxOneStep = 4;
//初始化,初始剩余步数即为总台阶数
leftSteps[0] = allSteps;
//标题头
Console.WriteLine("All Steps={0} , Max One Step={1}", allSteps, maxOneStep);
//计算
Steps(allSteps, maxOneStep, 1);
}
}
#台阶问题递归解法 Ruby版
allSteps = 5
oneMaxStep = 3
$leftSteps = Array.new
$leftSteps[0] = allSteps
$caseNumber = 1
def step(leftStepsSum,oneMaxStep,orders)
if leftStepsSum > 0
for thisStep in (1..oneMaxStep) do
$leftSteps[orders] = leftStepsSum - thisStep
step($leftSteps[orders],oneMaxStep,orders + 1)
end
elsif leftStepsSum == 0
print "CaseNumber #{$caseNumber}\t"
for thisOrder in (1..orders - 1)
print $leftSteps[thisOrder - 1] - $leftSteps[thisOrder]
end
$caseNumber += 1
puts
end
end
puts "All Steps=#{allSteps}, One Max Step=#{oneMaxStep}"
step(allSteps,oneMaxStep,1)