1. 程式人生 > 其它 >可能是全網最憨的青蛙跳臺階解法........

可能是全網最憨的青蛙跳臺階解法........

記錄一下 太憨了.....

原題目(同事發過來的)

遞迴解法

下面這個是本人的憨批原始碼

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:好傘兵的方法........