可能是全网最憨的青蛙跳台阶解法........

记录一下 太憨了.....

原题目(同事发过来的)

可能是全网最憨的青蛙跳台阶解法........

 

 

 递归解法

可能是全网最憨的青蛙跳台阶解法........

 

 

 

下面这个是本人的憨批源代码

step 总台阶数

num 计数变量

now 当前台阶总数

# step=int(input("请输入台阶的级数:"))
step = 4
num = 0
# now = 0


def jump(now):
    global num, step
    for i in range(1, step+1):
        now += i
        # print(i, num, now)
        if now < step:
            jump(now)
            print("前几个i:%s"%(i))
        elif now == step:
            num += 1
            print("相等时候的i:%s"%(i))
        now -= i


for j in range(1, step+1):
    print("第1次跳{}阶".format(j))
    jump(j)
    print(num)
print(num+1)

解题思路

我的想法是这样的

第一次可以跳N阶 一共N种情况从1开始 用for循环搞定

那就先算第二次的情况 第二次可以跳 (N-第一次跳的阶数) 所以也是从1开始

之后的情况跟第二次一样 所以并入第二次 也就是一般情况

于是定义函数jump() 接受当前 也就是第一次跳完之后的阶数now 然后就是函数jump设计 避免变量的变化(其实可以用常量代替......不过为了符合N 还是用了全局)

循环的次数设计 第二次以及之后每一次的跳阶阶数为1到step-now 然后让当前阶数加上当次循环阶数i

然后统计:

如果 加完之后当前总阶数小于总阶数 则代表还得继续跳 进入下一轮 故再次调用函数jump() 开始递归 为了结束递归之后能看到本轮递归i的值 加上了

print("前几个i:%s" % (i)) 第二种情况 正好跳完 那么就将计数变量num加一 这里的print同理 第三种情况 当前总阶数溢出了......不用管(其实这里是可以优化的 直接退出循环就可以了 不过因为运算量不大 就没写 毕竟已经很蠢了......) 思路就是这样 写的时候有点麻烦   Q1:   在跳完一次之后 now的值无法还原 也就是跳完1之后 剩下的情况无法统计完全 也就是 121 和 112 不容易做到 将now传到上一层递归出现了问题 因为最开始写的是       else 然后使用break退出 也就是   
else:
    num += 1
    print("相等时候的i:%s" % (i))
    break

 

A1:   最后在函数结束的最后流程自减 因为能够正常结束当轮函数 只有两种情况 要么满足if 已经回到了上一轮 要么满足elif 满足最后一轮相等 当然 都不满足的时候自减自然是没问题的 而前两种情况都是要加完之后要减的 所以直接放到最后 取消使用else break 就可以解决了 算是警醒自己 这种情况不要使用全局 太容易出问题了  Q2:   少一种情况 也就是第一次就全部跳完的情况 A2:   呃......最后加一就可以了 总结:   还是数学方法简单 数学 YYDS PS:好伞兵的方法........  
上一篇:【计算机组成原理】硬件如何比较数的大小


下一篇:Leetcode 045跳跃问题II(动态规划,贪心)