c语言递归算法的作用,C语言之通俗易懂的递归算法

bVbusnJ?w=1000&h=625

摘要

记得大学接触的第一门课程就是C语言,里面让我印象深刻之一就是递归,受大学老师讲递归的启发

我尝试着用最通俗、最易懂的方式讲解递归。递归其实真的不难。觉得递归很难的朋友,可以试试看一下,相信如果你能认真的看完这篇文章,或许会有很大的收获

递归产生条件

递归两个必要条件:

**1.递归函数**

**2.递归出口**

下面的练习会让你清晰的发现,递归其实就是要找 递归函数和递归出口 这两步

练习

假设有个数列 1 3 5 7 9 11 .... 找到第n项的值

逻辑分析:

bVbuswH?w=577&h=235

递归函数:f(n) = f(n-1)+2;

递归出口:f(1) = 1;

代码实现

/**

假设有个数列 1 3 5 7 9 11 ....

递归函数:f(n) = f(n-1)+2;

递归出口: f(1) = 1;

@param n 求n项的值

@return 返回第n项的值

*/

int find(int n) {

if (n == 1) {// 递归出口

return 1;

} else {//递归函数

return find(n-1)+2;

}

}

Fibonacci 斐波那契数列

逻辑分析:

bVbuswT?w=1146&h=602

递归函数:fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)

递归出口:fibonacci(1) = 1,fibonacci(2) = 1;

代码实现

/**

fibonacci 斐波那契数列

1 1 2 3 5 8 13 21 ....

递归函数:fibonacci(n) = fibonacci(n-1)+fibonacci(n-2)

递归出口:fibonacci(1) = 1,fibonacci(2) = 1;

@param n 求第n项

@return 返回第n项的值

*/

int fibonacci (int n) {

if (n==1 || n==2) { // 递归出口

return 1;

} else { //递归函数

return fibonacci(n-1)+fibonacci(n-2);

}

return 0;

}

有序数列求和:1+2+3+4+...+100

逻辑分析:

bVbuswZ?w=1240&h=562

递归函数:sum(n) = sum(n-1)+n

递归出口:f(1) = 1

代码实现

/**

//有序数列

求和:1+2+3+4+...+100

递归函数:sum(n) = sum(n-1)+n

递归出口:f(1) = 1

@param n 前n项

@return 返回 前n项的和

*/

int sum(int n) {

if (n == 1) {

return 1;

} else {

return sum(n-1)+n;

}

}

无序数列求前n项的和:{1, 7, 8, 6, 8, 9, 0, 10}

逻辑分析:

bVbusw5?w=1168&h=668

递归函数:sum1(arr,n) = sum1(arr,n-1)+arr[n];

递归出口:sum1(arr,0) = arr[0]

代码实现

/**

//无序数列

求前n项的和:int arr[] = {1, 7, 8, 6, 8, 9, 0, 10}

递归函数:sum1(arr,n) = sum1(arr,n-1)+arr[n];

递归出口:sum1(arr,0) = arr[0]

@param arr 数组

@param n 求数组中第几项

@return 返回中前n项的和

*/

int sum1(int arr[], int n) {

if (n == 0) {

return arr[0];

} else {

return sum1(arr,n-1)+arr[n];

}

}

无序数列求数组中前n项的最大值

逻辑分析:

bVbusxh?w=1250&h=558

bVbusxn?w=1074&h=588

递归函数:

if (findMaxNum(arr, n-1) > arr[n]) {

return findMaxNum(arr, n-1);

} else {

return arr[n];

};

递归出口: n == 0 return arr[0];

代码实现

/**

//无序数列

求数组中前n项的最大值:int arr1[] = {7, 4, 8, 6, 8, 9, 11, 5}

递归函数: if (findMaxNum(arr, n-1) > arr[n]) {

return findMaxNum(arr, n-1);

} else {

return arr[n];

};

递归出口:n == 0 return arr[0];

@param arr 数组

@param n 求数组中前n项的最大值

@return 返回数组中前n项的最大值

*/

int findMaxNum(int arr[], int n) {

if (n == 0) {

return arr[0];

} else if (findMaxNum(arr, n-1) > arr[n]) {

return findMaxNum(arr, n-1);

} else {

return arr[n];

}

}

测试功能

int num ;

num = find(6);

printf("第6项的值为%d\n",num);

num = fibonacci(6);

printf("第6项的值为%d\n",num);

num = sum(100);

printf("前100项的和为%d\n",num);

int arr[] = {1, 7, 8, 6, 8, 9, 0, 10};

num = sum1(arr,7);

printf("前7项的和为%d\n",num);

int arr1[] = {7, 4, 8, 6, 8, 9, 11, 5};

num = findMaxNum(arr1, 7);

printf("前7项的最大值为%d\n",num);

输出结果

bVbusxC?w=604&h=150

不积跬步,无以至千里

当我们踏上一条路,便不要再问路有多遥远,处境是否坎坷。我们不断的走走停停,繁华的是风景,荒芜的是岁月。

源码地址:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值