MENU

数的累加

• November 1, 2020 • 递归

编写求1,2,3,,,,,,,n这n个数累加的递归函数,假设n个数存放在数组arr中


题目分析:

求n个数的和非常简单,用到递归,三个步骤:

1.明确递归函数的参数
2.找到参数传递的规律
3.确定递归出口

第一步:确定参数,n个数放在数组中,数组作为容器,把数放在容器中,我们要对容器里面的数进行加和,因此数组是一个参数;有了容器,但是容器里面这么多数,我们不知道该对哪一个数进行加和,所以数在数组里面的下标也要作为参数。所以,数组是参数,数的下标值是第二个参数

第二步:找规律,1,2,3,4,5,6,,,,,,n这些数的规律是什么?后一个数比前一个数多1,所以我们在调用函数自身时,n+1和n-1肯定是要用到的(具体用哪一个根据你要传入的实参值而定,在此我们选择下标实参n-1(即数组中的第n个数),所以在代码中用到的是(n-1)

第三步:递归出口,递归是函数调用自身,但是不能不停地调用自身,否则就成了死循环了,在此题中,我们用到的规律是(n-1),所以当下标参数到0时(即到了第一个数字arr[0]),函数停止调用新的自身,开始回退,直到将所有调用的自身函数运行一遍,返回结果

废话就不多说了,我们直接看代码吧


实现代码:

#include<stdio.h>
#include<stdlib.h>
/*递归有两个过程
1.递推
2.回退
我们往往只需要考虑一个过程,因为两个过程是对称的
在此我们考虑递推过程*/
/*递归函数,返回数组arr[0]到arr[i]的和*/
int fact(int arr[], int i)    //数组,当前数组下标
{
    if (i == 0)               //递归出口,当递推到arr[0]时开始回退
        return arr[0];
    else
        return arr[i] + fact(arr, i-1);  //递推,当还没有加到arr[0]时,继续往前面加
}
int main() {
    int n;
    int arr[100];
    printf("输入n的值(n>=1):");
    scanf_s("%d", &n);
    for (int i = 0; i < n; i++)         //将1到n保存到数组中
        arr[i] = i + 1;
    printf("1到%d的和为:%d\n", n,fact(arr,n-1));   //打印和
    system("pause");                    //暂停,控制闪屏
    return 0;
}

运行结果:


从1加到6



从1加到8



从1加到100


代码编译器:Visual Studio 2017
ok,再见

Archives QR Code Tip
QR Code for this page
Tipping QR Code