台阶问题递归解法c#,ruby

//台阶问题递归解法 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)

转载于:https://my.oschina.net/magonglei/blog/16528

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值