写递归函数的核心思想:
1找到函数关系: f(n) = f(n-1) + 2
2找到出口: f(1) =1
递归数列
f(n) = f(n-1) + 2
f(1) =1
1 3 5 7 9
先写递归出口
#include<stdio.h>
#include<windows.h>
int f(int n) {
if(n == 1) {
return 1;
}
else {
return f(n-1)+2;
}
}
int main() {
int num = f(6);
printf("num = %d\n",num);
Sleep(10000);
}
// 1 3 5 7 9 11
斐波那契数列 Fibonacci
1 1 2 3 5 8 13 31
#include<stdio.h>
#include<windows.h>
int f(int n) {
if(n == 1) {
return 1;
}
else if(n ==2) {
return 1;
}
else {
return (f(n-1)+f(n-2));
}
}
int main() {
int num = f(6);
printf("num = %d\n",num);
Sleep(10000);
}
// 1 1 2 3 5 8 13 31
// 1 2 3 4 5 6 7 8
所有循环都可以用递归来表示
扫描二维码关注公众号,回复: 5781670 查看本文章求sum:1加到100的和
1.找出来公式 f(n) = f(n-1) + n
2.找到出口 f(1) =1
1+2+3...+100
#include<stdio.h>
#include<windows.h>
int sum(int n) {
if(n == 1) {
return 1;
}
else {
return (sum(n-1)+n);
}
}
int main() {
int num = sum(100);
printf("num = %d\n",num);
Sleep(10000);
}
// 应该得到5050
int arr[] = {1,7,8,6,4,7,3}
求数组的前n项和,
1 下面是递归关系
sum(arr,n) = sum(arr,n-1) + arr[n]
2 递归出口是 sum(arr,0) = arr[0]
#include<stdio.h>
#include<windows.h>
int sum(int arr[], int n) {
if(n == 0) {
return arr[0];
}
else {
return (sum(arr, n-1) + arr[n]); // 这里需要写arr,而不是arr[]
}
}
int main() {
int arr[9] = {9,8,7,6,5,4,3,2,1}; // 9个数
int num = sum(arr, 8); // 这里需要写arr,而不是arr[].需要写8而不是9,第八个数是1
printf("num = %d\n",num);
Sleep(10000);
return 0;
}
// 得45
求数组前n项的最大值
1 关系:如果数组前n-1项的最大值>第n项, 最大值为arr[n],否则最大值是maxnum(arr, n-1)
2 递归出口:如果数组arr只有一项,则是这一项arr[0]
#include<stdio.h>
#include<windows.h>
int maxnum(int arr[], int n) {
if (n == 0) {
return arr[0];
}
else if (maxnum(arr, n-1) > arr[n]) {
return maxnum(arr, n-1);
}
else {
return arr[n];
}
}
int main() {
int arr[9] ={1,2,6,8,9,4,3,5,7};
printf("maxnum(8)=%d\n", maxnum(arr, 2));
Sleep(10000);
return 0;
}