mirror of
https://github.com/krahets/hello-algo.git
synced 2025-11-02 21:24:53 +08:00
Sort the coding languages by applications. (#721)
This commit is contained in:
@ -12,10 +12,10 @@
|
||||
|
||||
以下函数基于 `for` 循环实现了求和 $1 + 2 + \dots + n$ ,求和结果使用变量 `res` 记录。需要注意的是,Python 中 `range(a, b)` 对应的区间是“左闭右开”的,对应的遍历范围为 $a, a + 1, \dots, b-1$ 。
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{forLoop}
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{for_loop}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -24,10 +24,16 @@
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{for_loop}
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -36,6 +42,12 @@
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="iteration.js"
|
||||
@ -48,30 +60,6 @@
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="iteration.dart"
|
||||
@ -84,6 +72,18 @@
|
||||
[class]{}-[func]{for_loop}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{forLoop}
|
||||
```
|
||||
|
||||
下图展示了该求和函数的流程框图。
|
||||
|
||||

|
||||
@ -96,10 +96,10 @@
|
||||
|
||||
下面,我们用 `while` 循环来实现求和 $1 + 2 + \dots + n$ 。
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{whileLoop}
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{while_loop}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -108,10 +108,16 @@
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{while_loop}
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -120,6 +126,12 @@
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="iteration.js"
|
||||
@ -132,30 +144,6 @@
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="iteration.dart"
|
||||
@ -168,14 +156,26 @@
|
||||
[class]{}-[func]{while_loop}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{whileLoop}
|
||||
```
|
||||
|
||||
在 `while` 循环中,由于初始化和更新条件变量的步骤是独立在循环结构之外的,**因此它比 `for` 循环的自由度更高**。
|
||||
|
||||
例如在以下代码中,条件变量 $i$ 每轮进行了两次更新,这种情况就不太方便用 `for` 循环实现。
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{whileLoopII}
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{while_loop_ii}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -184,10 +184,16 @@
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{while_loop_ii}
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -196,6 +202,12 @@
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="iteration.js"
|
||||
@ -208,30 +220,6 @@
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="iteration.dart"
|
||||
@ -244,16 +232,28 @@
|
||||
[class]{}-[func]{while_loop_ii}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{whileLoopII}
|
||||
```
|
||||
|
||||
总的来说,**`for` 循环的代码更加紧凑,`while` 循环更加灵活**,两者都可以实现迭代结构。选择使用哪一个应该根据特定问题的需求来决定。
|
||||
|
||||
### 嵌套循环
|
||||
|
||||
我们可以在一个循环结构内嵌套另一个循环结构,以 `for` 循环为例:
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{nestedForLoop}
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{nested_for_loop}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -262,10 +262,16 @@
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="iteration.py"
|
||||
[class]{}-[func]{nested_for_loop}
|
||||
```java title="iteration.java"
|
||||
[class]{iteration}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -274,6 +280,12 @@
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="iteration.js"
|
||||
@ -286,30 +298,6 @@
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="iteration.cs"
|
||||
[class]{iteration}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="iteration.swift"
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="iteration.dart"
|
||||
@ -322,6 +310,18 @@
|
||||
[class]{}-[func]{nested_for_loop}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="iteration.c"
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="iteration.zig"
|
||||
[class]{}-[func]{nestedForLoop}
|
||||
```
|
||||
|
||||
下图给出了该嵌套循环的流程框图。
|
||||
|
||||

|
||||
@ -345,10 +345,10 @@
|
||||
|
||||
观察以下代码,我们只需调用函数 `recur(n)` ,就可以完成 $1 + 2 + \dots + n$ 的计算:
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="recursion.java"
|
||||
[class]{recursion}-[func]{recur}
|
||||
```python title="recursion.py"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -357,10 +357,16 @@
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="recursion.py"
|
||||
[class]{}-[func]{recur}
|
||||
```java title="recursion.java"
|
||||
[class]{recursion}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="recursion.cs"
|
||||
[class]{recursion}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -369,6 +375,12 @@
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="recursion.swift"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="recursion.js"
|
||||
@ -381,30 +393,6 @@
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="recursion.c"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="recursion.cs"
|
||||
[class]{recursion}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="recursion.swift"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="recursion.zig"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="recursion.dart"
|
||||
@ -417,6 +405,18 @@
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="recursion.c"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="recursion.zig"
|
||||
[class]{}-[func]{recur}
|
||||
```
|
||||
|
||||
下图展示了该函数的递归过程。
|
||||
|
||||

|
||||
@ -453,10 +453,10 @@
|
||||
|
||||
以计算 $1 + 2 + \dots + n$ 为例,我们可以将结果变量 `res` 设为函数参数,从而实现尾递归。
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="recursion.java"
|
||||
[class]{recursion}-[func]{tailRecur}
|
||||
```python title="recursion.py"
|
||||
[class]{}-[func]{tail_recur}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -465,10 +465,16 @@
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="recursion.py"
|
||||
[class]{}-[func]{tail_recur}
|
||||
```java title="recursion.java"
|
||||
[class]{recursion}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="recursion.cs"
|
||||
[class]{recursion}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -477,6 +483,12 @@
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="recursion.swift"
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="recursion.js"
|
||||
@ -489,30 +501,6 @@
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="recursion.c"
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="recursion.cs"
|
||||
[class]{recursion}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="recursion.swift"
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="recursion.zig"
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="recursion.dart"
|
||||
@ -525,6 +513,18 @@
|
||||
[class]{}-[func]{tail_recur}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="recursion.c"
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="recursion.zig"
|
||||
[class]{}-[func]{tailRecur}
|
||||
```
|
||||
|
||||
两种递归的过程对比如下图所示。
|
||||
|
||||
- **普通递归**:求和操作是在“归”的过程中执行的,每层返回后都要再执行一次求和操作。
|
||||
@ -549,10 +549,10 @@
|
||||
|
||||
按照递推关系进行递归调用,将前两个数字作为终止条件,便可写出递归代码。调用 `fib(n)` 即可得到斐波那契数列的第 $n$ 个数字。
|
||||
|
||||
=== "Java"
|
||||
=== "Python"
|
||||
|
||||
```java title="recursion.java"
|
||||
[class]{recursion}-[func]{fib}
|
||||
```python title="recursion.py"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "C++"
|
||||
@ -561,10 +561,16 @@
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Python"
|
||||
=== "Java"
|
||||
|
||||
```python title="recursion.py"
|
||||
[class]{}-[func]{fib}
|
||||
```java title="recursion.java"
|
||||
[class]{recursion}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="recursion.cs"
|
||||
[class]{recursion}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Go"
|
||||
@ -573,6 +579,12 @@
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="recursion.swift"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "JS"
|
||||
|
||||
```javascript title="recursion.js"
|
||||
@ -585,30 +597,6 @@
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="recursion.c"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "C#"
|
||||
|
||||
```csharp title="recursion.cs"
|
||||
[class]{recursion}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Swift"
|
||||
|
||||
```swift title="recursion.swift"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="recursion.zig"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Dart"
|
||||
|
||||
```dart title="recursion.dart"
|
||||
@ -621,6 +609,18 @@
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "C"
|
||||
|
||||
```c title="recursion.c"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
=== "Zig"
|
||||
|
||||
```zig title="recursion.zig"
|
||||
[class]{}-[func]{fib}
|
||||
```
|
||||
|
||||
观察以上代码,我们在函数内递归调用了两个函数,**这意味着从一个调用产生了两个调用分支**。如下图所示,这样不断递归调用下去,最终将产生一个层数为 $n$ 的「递归树 recursion tree」。
|
||||
|
||||

|
||||
|
||||
Reference in New Issue
Block a user