算法作业第二章-递归算法设计2

本文介绍了如何用尾递归算法求解Fibonacci数列的第n项,并通过递归算法解决分黑球问题。提供了C++代码示例,展示了算法的思路和运行过程。
摘要由CSDN通过智能技术生成

目录

1 用尾递归算法求解Fibonacci数列的第n项

代码:

结果截图:

算法思路:

运行过程:

​​​​​​​2 用递归算法实现分黑球问题

代码:

结果截图:

算法思路:

运行过程:


​​​​​​​1 用尾递归算法求解Fibonacci数列的第n项

代码:

#include <bits/stdc++.h>

using namespace std;



/*尾递归算法求解Fibonacci数列*/

int Fibonacci(int n, int m, int a, int b) {

    if (n == 0) {

        return a;

    } else {

        return Fibonacci(n - 1, m + 1, a + b, a);

    }

}



int main () {

    cout << "请输入要求解的斐波拉契数列的项数:";

    int n;

    cin >> n;

    cout << "斐波拉契数列的第n项为:";

    if (n == 0) {

        cout << 1 << endl;

    } else {

        --n;

        cout << Fibonacci(n, 1, 1, 1) << endl;

    }

    return 0;

}

结果截图:

算法思路:

n为需要递归的次数,m为a的项数,a为m项的数值,b为m-1项的数值。每进行一次递归,m的值加1,a由原来的m项的值变为m+1项的值,b变为原来a的值,直至递归次数用尽,m即为所需项,a即为所需值。

运行过程:

Fibonaccin, m, 1, 1->Fibonacci(n - 1, m + 1, 2, 1)->……->Fibonacci(0, n + m, F(n + m), F(n + m - 1))

​​​​​​​2 用递归算法实现分黑球问题

代码:

#include <bits/stdc++.h>

using namespace std;



/*递归算法实现分黑球问题*/

int BlackBall(int numBall, int numBox, int index) {

    if(numBox == 0) {

        if (numBall == 0) {

            return 1;

        } else {

            return 0;

        }

    } else {

        int res = 0;

        if (index == -1) {

            for (int i = 0; i <= numBall; ++i) {

                res += BlackBall(numBall - i, numBox - 1, i);

            }

            return res;

        } else {

            for (int k = 0; k <= min(numBall, index); ++k) {

                res += BlackBall(numBall - k, numBox - 1, k);

            }

            return res;

        }

    }

}



int main() {

    int numBall, numBox;

    cout << "请输入黑球的个数:";

    cin >> numBall;

    cout << "请输入箱子的个数:";

    cin >> numBox;

    cout << "有效的放置方法有" << BlackBall(numBall, numBox, -1) << "种" << endl;

    return 0;

}

结果截图:

算法思路:

因为类似1,2,3和3,2,1的放法是同一种放法,因此,为了避免重复,可以通过保证前一个盒子里面的球个数永远大于等于下一个盒子里面球的个数,并且保证下一个盒子的球数不超过现有球的数量来解决。在不断的存放过程中,如果存放到最后有球剩余显然是不成功的放法,返回0,反之,返回1。通过累加得到最终合理的存放方法数。

运行过程:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

厂里英才

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值