面试题:使用递归的方法计算1到100的累加。

简介: 今天去面试,遇到这道题目,有段时间没写程序了,温习一下: 题目是使用递归的方法计算1到100的累加,也就是计算1+2+3+4+........+100。大家想必已经听说过高斯如何计算这道题的故事,也知道答案是5050。
今天去面试,遇到这道题目,有段时间没写程序了,温习一下:

题目是使用递归的方法计算1到100的累加,也就是计算1+2+3+4+........+100。大家想必已经听说过 高斯如何计算这道题的故事,也知道答案是5050。我整理了一下使用递归解决的思路,与大家分享。

递归的特点就是递归函数本身会调用自己,对应到逻辑上就是一段逻辑会使用这段逻辑自身。要使用递归的方法解决这道题,就要先用递归的思维方式描叙这道题。

我们来看看如何描叙题目本身,最直观的描叙:“从1开始,后一个数加上前一个数,后一个数是前一个数加一所得,一直加到100”,但这种描叙无法转化为递归的方法。我们试着按递归的思路思考这个问题,“做一件事情的步骤又包含这个事情步骤的自身”:
  1. 最开始一定是“1”+“某个值
  2. 如果按老思路,这个“某个值”是“1”再加"1",也就是“2”
  3. 到这里,已经完成了一段步骤,并且如果这种思路能形成递归,上面的两步的描叙里面应该会包含对自身同样步骤的一段描叙,但我们仔细想想,里面却没有。
  4. 那我们换个角度思考一下,这个“某个值"也可以是‘2’到‘100’累加的和。到这里,我们看到了点希望,因为”累加的和“这个词就是第1、2步在做的事。
  5. 那么‘2’到‘100’累加的和又应该是‘2’加上”‘3’到‘100’累加的和“,这里我们已经看到递归的迹象了。
  6. 再举一例看看,‘3’到‘100’累加的和又应该是‘3’加上”‘4’到‘100’累加的和“
  7. 对于递归,还有最重要的一点就是这种嵌套何时终止,不然就无穷无尽了。我们看看最后一步,也就是‘100‘到’100‘累加的和是多少?这次我们不用,也无法递归调用了,结果应该直接就是100,所以到这一步,递归终止。

对于整个问题,我们可以进一步抽象为用递归法求两个正整数(m,n)累加和的问题,我们还要考虑m<n, m=n, m>n这三种参数传入方式不同的情况。下面是我写的C#代码,以供参考:

using  System;
using  System.Collections.Generic;
using  System.Text;

namespace  Accumulation
{
    class Program
        {
        public static int Accum(int m, int n)
        {
           //对于接受的参数,要考虑m >n,m=n,m<n三种情况。
            if (m < n)
            {
                 return (m + Accum(++m, n)); //如果m<n,返回“m”加上“m+1到n累加的和”
            }

            else
           {
                if (m > n)
               {
                    return (m + Accum(--m, n)); //如果m.n,返回“m”加上“m-1到n累加的和”
            }

                else
                {
                    return n; //如果m=n,直接返回n,这是递归的关键。
                }


           }

        }


        static void Main(string[] args)
        {
            Console.WriteLine(
"The Result of Accumulation from 1 to 100 is:" + Accum(1100));
            Console.WriteLine(
"The Result of Accumulation from 1000 to 1 is:" + Accum(10001));
            Console.WriteLine(
"The Result of Accumulation from 80 to 80 is:" + Accum(8080));
        }

    }

}



相关文章
|
10月前
|
人工智能 前端开发 Java
Java 面试资料中相关代码使用方法与组件封装方法解析
这是一份详尽的Java面试资料代码指南,涵盖使用方法与组件封装技巧。内容包括环境准备(JDK 8+、Maven/Gradle)、核心类示例(问题管理、学习进度跟踪)、Web应用部署(Spring Boot、前端框架)、单元测试及API封装。通过问题库管理、数据访问组件、学习进度服务和REST接口等模块化设计,帮助开发者高效组织与复用功能,同时支持扩展如用户认证、AI推荐等功能。适用于Java核心技术学习与面试备考,提升编程与设计能力。资源链接:[点此下载](https://pan.quark.cn/s/14fcf913bae6)。
189 6
Java 面试资料中相关代码使用方法与组件封装方法解析
|
12月前
|
人工智能 算法 数据库
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
美团面试:LLM大模型存在哪些问题?RAG 优化有哪些方法?_
|
Java 程序员 调度
Java 高级面试技巧:yield() 与 sleep() 方法的使用场景和区别
本文详细解析了 Java 中 `Thread` 类的 `yield()` 和 `sleep()` 方法,解释了它们的作用、区别及为什么是静态方法。`yield()` 让当前线程释放 CPU 时间片,给其他同等优先级线程运行机会,但不保证暂停;`sleep()` 则让线程进入休眠状态,指定时间后继续执行。两者都是静态方法,因为它们影响线程调度机制而非单一线程行为。这些知识点在面试中常被提及,掌握它们有助于更好地应对多线程编程问题。
590 9
|
安全 Java 程序员
Java面试必问!run() 和 start() 方法到底有啥区别?
在多线程编程中,run和 start方法常常让开发者感到困惑。为什么调用 start 才能启动线程,而直接调用 run只是普通方法调用?这篇文章将通过一个简单的例子,详细解析这两者的区别,帮助你在面试中脱颖而出,理解多线程背后的机制和原理。
860 12
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
578 4
|
缓存 安全 Java
【JavaEE】——单例模式引起的多线程安全问题:“饿汉/懒汉”模式,及解决思路和方法(面试高频)
单例模式下,“饿汉模式”,“懒汉模式”,单例模式下引起的线程安全问题,解锁思路和解决方法
|
Java API 索引
【Java基础面试二十四】、String类有哪些方法?
这篇文章列举了Java中String类的常用方法,如`charAt()`、`substring()`、`split()`、`trim()`、`indexOf()`、`lastIndexOf()`、`startsWith()`、`endsWith()`、`toUpperCase()`、`toLowerCase()`、`replaceFirst()`和`replaceAll()`,并建议面试时展示对这些方法的熟悉度,同时深入理解部分方法的源码实现。
【Java基础面试二十四】、String类有哪些方法?
|
ARouter 测试技术 API
Android经典面试题之组件化原理、优缺点、实现方法?
本文介绍了组件化在Android开发中的应用,详细阐述了其原理、优缺点及实现方式,包括模块化、接口编程、依赖注入、路由机制等内容,并提供了具体代码示例。
423 2
【Java集合类面试三十】、BlockingQueue中有哪些方法,为什么这样设计?
BlockingQueue设计了四组不同行为方式的方法用于插入、移除和检查元素,以适应不同的业务场景,包括抛异常、返回特定值、阻塞等待和超时等待,以实现高效的线程间通信。
【多线程面试题 二】、 说说Thread类的常用方法
Thread类的常用方法包括构造方法(如Thread()、Thread(Runnable target)等)、静态方法(如currentThread()、sleep(long millis)、yield()等)和实例方法(如getId()、getName()、interrupt()、join()等),用于线程的创建、控制和管理。