C语言练习六 爬楼梯
内容纲要

树老师爬楼梯,他可以每次走1级或者2级,输入楼梯的级数,求不同的走法数。

思考:

一、自己的第一思考方式:也就是走的数之和等于楼梯数。大概分三大类:都走1,都走2(判断是不是偶数),混合。
疑问点:但是这个混合怎么去求走法数?说明考虑有误。
再回头改变下思考逻辑,不分类了直接表示所有的情况。
从普遍到特殊流程如下:
第一次可以走1或者2,第二次可以走1或者2,第三次还可以走1或者2,这样不断分级分下去,最后一定会剩下1层或者是0层,就无法再分了,做一个记录(本来想法是这里来一个count++记录,因为不能再分了所有需要跳出函数return一下。!!!但是。这么写的话用count就代替了函数的作用。。函数的返回值函数的目的就没了,本末倒置)。

二、逻辑整理:需要一个函数来计算走法数,那么可以是返回值记录,也可以是函数过程中的副作用来记录。
为了直观,所以用返回值记录。这里不牵扯其他函数,所有我要做的就是一直递归到最小值1或者0,然后return跳出函数结束一次递归。

三、在此基础上做以升级,如果能每次走1、2、3台阶可能有多少种呢?
Q:如果依旧按照上面的程序考虑会出现什么问题呢?
A:在只爬1、2级的时候,n==1会return跳出,不会出现1-2=-1的情况。而当我们需要爬3级,还只判断n==1和n==0,当n=2时,2-3=-1了永远不满足递归的跳出条件了,将无限的递归下去。

所以这里要对递归跳出的条件进行优化,考虑n等于1、2、3时分别有多少种情况,而不是一种情况一种情况遍历累加。即n==1 return 1,n==2,return 2,n==3,return 4。(当然这里只有2会出现负值,如果写了n==2的跳出,依旧可以不写n==3,写成n==0,但这具有特殊性,为了得到普适性结论,写出n==3的跳出更好)————见程序二。

程序:

程序一:

#include <stdio.h>
int count = 0;

/*int palou(int n) {
    if (n == 1)
        return count++;
    if (n == 0)
        return count++;
    return palou(n - 1) + palou(n - 2);
}*/

int palou(int n) {
    if (n == 1)
        return 1;
    if (n == 0)
        return 1;
    return palou(n - 1) + palou(n - 2);
}

int main(void) {
    int n;
    scanf("%d", &n);
    count = palou(n);
    printf("%d", count);
}

程序二:

#include <stdio.h>
int count = 0;
int palou(int n) {

    if (n == 1)
        return 1;
    if (n == 2)
        return 2;
    /*  if (n == 3)
            return 4;*/
    if (n == 0)
        return 1;
    return palou(n - 1) + palou(n - 2) + palou(n - 3);
}

int main(void) {
    int n;
    scanf("%d", &n);
    count = palou(n);
    printf("%d", count);
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇