递归概念和特点:
在数学和计算机科学中,递归是指在方法的定义中使用方法自身。也就是说,递归算法是一种直接或间接调用自身方法的算法。简言之:在定义自身的同时又出现自身的直接或间接调用。注意:递归必须要有一个退出的条件!递归算法解决问题的特点有以下几点:1)递归就是方法里调用自身。2)在使用递增归策略时,必须有一个明确的递归结束条件,称为递归出口。3)递归算法解题通常显得很简洁,但递归算法解题的运行效率较低。所以一般不提倡用递归算法设计程序。4)在递归调用的过程当中系统为每一层的返回点、局部量等开辟了栈来存储。递归次数过多容易造成栈溢出等,所以一般不提倡用递归算法设计程序。在做递归算法的时候,一定要把握住出口,也就是做递归算法必须要有一个明确的递归结束条件。这一点是非常重要的。
迭代概念:
迭代法也称辗转法,是一种不断用变量的旧值递推新值的过程,跟迭代法相对应的是直接法(或者称为一次解法),即一次性解决问题。
迭代和递归的关系和区别:
从概念上讲,递归就是指程序调用自身的编程思想,即一个函数调用本身;迭代是利用已知的变量值,根据递推公式不断演进得到变量新值得编程思想。简单地说,递归是重复调用函数自身实现循环。迭代是函数内某段代码实现循环。在循环的次数较大的时候,迭代的效率明显高于递归。
实际问题:求n的阶乘 图解理解:
下面是一个求n的阶乘的Java代码示例:public class Demo6 { public static void main(String[] args) { System.out.println(fact(5)); } public static int fact(int n) { if(n == 1) { return n = 1; }else { return n*fact(n-1); } } }
下面是斐波那契数列的递归实现:
```python
def fibonacci(n):
if n <= 0:
return "Input should be positive integer"
elif n == 1:
return 0
elif n == 2:
return 1
else:
return fibonacci(n-1) + fibonacci(n-2)
print(fibonacci(9)) # Output: 34
递归实现:
```cpp
int fib(int n){ if(n > 1) return fib(n-1) + fib(n-2); else return n; // n = 0, 1时给出recursion终止条件 }
```
迭代实现:
```cpp
int fib(int n){ int i, temp0, temp1, temp2; if(n <= 1) return n; temp1 = 0; temp2 = 1; for(i = 2; i <= n; i++){ temp0 = temp1 + temp2; temp2 = temp1; temp1 = temp0; } return temp0; }
```
遇到的问题:在做银行的题目的时候,有遇到一道递归求电阻的题目。但是当时自己写的代码报出StackOverflowError错误。
```java
/** * @author Kino * @create 2022-10-20 20:23 */
public class Test {
public static void main(String[] args) {
double digui = digui(5, 1, 1, 1); // double digui = digui1(5, 1, 1, 1);
System.out.println(digui);
}
public static double digui(int level,double r1,double r2, double r3){
if (level == 1){
return r1 + r2 + r3;
} else {
double sum = r1 + r2 + (r3 * digui(level-1,r1,r2,r3)) / (r3 + digui(level-1,r1,r2,r3));
return sum;
}
}
public static double digui1(int level,double r1,double r2, double r3){
if (level == 1){
return r1 + r2 + r3;
} else {
return r1 + r2 + (r3 * digui1(--level,r1,r2,r3)) / (r3 + digui1(--level,r1,r2,r3));
}
}
}
```
在编程中,有时候我们会遇到一个问题,即使已经对变量进行了修改,但是变量的值仍然保持不变。这可能是因为我们在使用–level时没有正确地更新变量的值。为了解决这个问题,我们需要确保在修改–level时,同时也要更新对应的变量值。
例如,假设我们有一个名为`level`的变量,我们想要将其值设置为1。但是,由于某种原因,即使我们已经将–level的值修改为1,`level`的值仍然保持不变。这时,我们需要检查我们的代码,确保在修改–level时,同时也更新了对应的变量值。
以下是一个简单的示例,演示了如何正确地修改变量值:
```python
# 初始化变量
level = 0
# 修改–level的值
level = level - 1
print("修改后的–level值:", level)
print("修改后的level值:", level)
```
在这个示例中,我们首先初始化了一个名为`level`的变量,其值为0。然后,我们使用`level = level - 1`这行代码来修改–level的值。这样一来,当我们打印出修改后的–level和level值时,我们可以看到它们的值已经被正确地更新了。