函数递归

函数递归,简单的理解就是,自己调用自己,直到遇到边界条件,停止递归

比如我们想实现一个阶乘函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
int n = 5;//求n!  这里是5!


//不使用递归,一种可行的做法是这样
int ans = 1;
for (int i = 1; i <= n; i++) {
ans *= i;
}
printf("%d! = %d", n, ans);


//使用递归
int _n(int x) {
if (x == 0)return 1;
return x * _n(x - 1);
}
printf("%d! = %d", n, _n(n));
/*
对于 _n(5),我们拆分一下它自己调用自己的过程↓
_n(5)
5 * _n(4)
4 * _n(3)
3 * _n(2)
2 * _n(1)
1 * _n(0)
1
达到边界,返回值为:5*4*3*2*1*1的 结果 (是,结果,不是这个计算式)
*/

define和const的区别

define:

  • define 是一个预处理指令,通常在 C 和 C++ 这类编程语言中使用。
  • 它用于定义编译时常量,这意味着在编译程序之前就将其值固定下来。
  • define 通常用于创建符号常量(宏常量),例如:
    1
    #define MAX_VALUE 100
  • 这样的定义会在编译时进行文本替换,将所有出现 MAX_VALUE 的地方替换为 100没有变量类型或内存分配
1
2
3
4
5
6
7
8
9
#include <stdio.h>

#define MAX_VALUE 100

int main() {
int x = MAX_VALUE;
printf("x的值是: %d\n", x);
return 0;
}

在这个示例中,MAX_VALUE 被定义为 100,并且在 main 函数中将其赋值给变量 x。当编译此代码时,预处理器会将 MAX_VALUE 替换为 100,因此在编译后的代码中,int x = MAX_VALUE; 实际上变成了 int x = 100;。这样,编译后的程序中不再存在 MAX_VALUE 符号,而是直接包含了 100 的值。

const:

  • const 是一种变量修饰符,通常在多种编程语言中使用,包括 C++, C#, JavaScript 等。
  • 它用于创建不可变的量,也就是常量。
  • const 变量在运行时具有类型和内存分配,通常存储在内存中,但其值无法被修改。
  • 例如,在 C++ 中:
    1
    const int MAX_VALUE = 100;
  • 这样的定义创建了一个整数常量,不能在后续代码中修改 MAX_VALUE 的值。
1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

const int MAX_VALUE = 100;

int main() {
int x = MAX_VALUE;
// 试图修改 MAX_VALUE,将导致编译错误
// MAX_VALUE = 200;
printf("x的值是: %d\n", x);
return 0;
}

在这个示例中,MAX_VALUE 被定义为整数常量 100,并且在 main 函数中将其赋值给变量 x

如果你尝试在后续代码中修改 MAX_VALUE 的值(例如,MAX_VALUE = 200;),编译器将报错,因为MAX_VALUE 被声明为const,这意味着它是不可修改的常量。

所以,使用const关键字可以确保变量的值在后续代码中不会被修改。


defineconst 的主要区别在于:

  • define 用于创建编译时常量,没有变量类型和内存分配,只是文本替换。
  • const 用于创建运行时常量,具有变量类型和内存分配,但其值无法被修改。