首页 > 其他分享 >Android-Kotlin-递归与尾递归

Android-Kotlin-递归与尾递归

时间:2023-06-22 14:33:37浏览次数:33  
标签:递归 Int Kotlin addOperation number 累加 result Android


递归:

阶乘计算:

/**
         * 阶乘:
         *      1的阶乘是1,因为1往下走一个楼梯 就是0了
         *      2的阶乘是 2*1
         *      3的继承是 3*2*1
         *      4的继承是 4*3*2*1
         *      5的阶乘是 5*4*2*1
         */
package cn.kotlin.kotlin_base06

import java.lang.Exception

/**
 * 递归
 */
fun main(args: Array<String>) {

    while (true) {

        println("请输入整数,用于计算阶乘...")
        var inputNumber = readLine()

        var number: Int = 0

        try {
            // inputNumber!!.toInt()  !!代表一定不会为空,所以Kotlin才放心的让我.toInt() 编译通过
            number = inputNumber!!.toInt()

        } catch (e: Exception) {
            println("你输入的不是整数...")
        }

        /**
         * 阶乘:
         *      1的阶乘是1,因为1往下走一个楼梯 就是0了
         *      2的阶乘是 2*1
         *      3的继承是 3*2*1
         *      4的继承是 4*3*2*1
         *      5的阶乘是 5*4*2*1
         */
        var result = operation(number!!)
        println("计算结果是>>>>>>>>>>>>>${result}")

    }
}

/**
 * 定义运算number的方法
 * 返回计算结果
 */
fun operation(number: Int) : Int {
    var result = when(number) {
        1 -> 1
        else -> number * operation(number - 1)
    }
    return result
}

执行结果:

Android-Kotlin-递归与尾递归_递归

尾递归:

累加计算:

/**
 * 累加计算:
 *      1的累加是1,因为1下面是0 没得 +加了
 *      2的累加是 2+1
 *      3的累加是 3+2+1
 *      4的累加是 4+3+2+1
 *      5的累加是 5+4+3+2+1
 *      .......
 */

累加计算【案例一】:

package cn.kotlin.kotlin_base06

/**
 * 尾递归
 */
fun main(args: Array<String>) {

    /**
     * 累加计算:
     *      1的累加是1,因为1下面是0 没得 +加了
     *      2的累加是 2+1
     *      3的累加是 3+2+1
     *      4的累加是 4+3+2+1
     *      5的累加是 5+4+3+2+1
     *      .......
     */
    var result = addOperation(4)
    println("累加计算的结果是:${result}")
}

/**
 * 定义运算number的方法
 * 返回计算结果
 */
fun addOperation(number: Int) : Int {
    var result = when(number) {
        1 -> 1
        else -> number + addOperation(number - 1)
    }
    return result
}

执行结果:

Android-Kotlin-递归与尾递归_android_02



累加计算 【案例二】,对以上【案例一】进行了 更大值得累加 来复习溢出的异常:
只把需要累加的值,100000的累加:

var result = addOperation(100000)
package cn.kotlin.kotlin_base06

/**
 * 尾递归
 */
fun main(args: Array<String>) {

    /**
     * 累加计算:
     *      1的累加是1,因为1下面是0 没得 +加了
     *      2的累加是 2+1
     *      3的累加是 3+2+1
     *      4的累加是 4+3+2+1
     *      5的累加是 5+4+3+2+1
     *      .......
     */
    var result = addOperation(100000)
    println("累加计算的结果是:${result}")
}

/**
 * 定义运算number的方法
 * 返回计算结果
 */
fun addOperation(number: Int) : Int {
    var result = when(number) {
        1 -> 1
        else -> number + addOperation(number - 1)
    }
    return result
}

执行结果,溢出的异常:

Android-Kotlin-递归与尾递归_递归_03



以上【案例二】,引发了溢出的异常,是因为计算机运算了N多次,都计算不完 因为太多了,所以计算机直接抛出了溢出的溢出

以下【案例三】是使用Kotlin提供的 尾递归优化机制,来解决溢出的异常问题:

package cn.kotlin.kotlin_base06

/**
 * 尾递归
 */
fun main(args: Array<String>) {

    /**
     * 累加计算:
     *      1的累加是1,因为1下面是0 没得 +加了
     *      2的累加是 2+1
     *      3的累加是 3+2+1
     *      4的累加是 4+3+2+1
     *      5的累加是 5+4+3+2+1
     *      .......
     */
    var r = 0
    addOperation(100000, r)
}

/**
 * 增加了tailrec尾递归优化机制后,它认为以下返回的不是递归操作,所以需要修改
 */
/*
tailrec fun addOperation(number: Int) : Int {
    var result = when(number) {
        1 -> 1
        else -> number + addOperation(number - 1)
    }
    return result
}*/

/**
 * 增加了tailrec尾递归优化机制后,它认为以下返回的不是递归操作,所以需要修改
 */
/**
 * 定义运算number的方法
 * 返回计算结果
 */
tailrec fun addOperation(number: Int, r: Int) : Int {
    println("累加计算的结果是:${r}, 计算机在第${number}次计算....")
    if (1 == number) {
        return 1
    } else {
        return addOperation(number - 1, r + number)
    }
}

执行结果:不会出现溢出的异常了:

Android-Kotlin-递归与尾递归_android_04

增加了tailrec尾递归优化机制后,它会去判断是否是递归,所以不能用when来判断,否则他认为这不是递归 还是会引发溢出溢出,最好用if return 自身的方法


标签:递归,Int,Kotlin,addOperation,number,累加,result,Android
From: https://blog.51cto.com/u_16163510/6534870

相关文章

  • Android-引导用户指纹录入
    根据不同的手机,跳转到指纹录入界面,如果没有检测到手机的品牌,就提醒用户手动去指纹录入:首先描述手机信息检测对象,PhoneInfoCheck.java:packagecom.esandinfo;importandroid.app.AlertDialog;importandroid.content.ComponentName;importandroid.content.Context;importandr......
  • Android—MySQLiteOpenHelper源码解读
    MySQLiteOpenHelper:直接放上源码,解读在注释里packagecom.esandinfo;importandroid.content.Context;importandroid.database.sqlite.SQLiteDatabase;importandroid.database.sqlite.SQLiteOpenHelper;importandroid.util.Log;publicclassMySQLiteOpenHelperextends......
  • 腾讯Android岗三面:EventBus 发送的消息,如何做到线程切换?
    一.前言EventBus是一个基于观察者模式的事件订阅/发布框架,利用EventBus可以在不同模块之间,实现低耦合的消息通信。EventBus因为其使用简单且稳定,被广泛应用在一些生产项目中。通常我们就是使用EventBus分发一些消息给消息的订阅者,除此之外我们还可以通过EventBus将消息传......
  • Android:教你如何避免解决WebView内存泄漏
    一直听说WebView使用不当容易造成内存泄漏,网上有很多针对内存泄漏的解决方案,比较多的是在Activity.onDestroy的时候将WebView从View树中移除,然后再调用WebView.destroy方法:overridefunonDestroy(){valparent=webView?.parentif(parentisViewGroup){......
  • 【建议私藏】Android进阶开发面试必背300题,都在这里了~
    Android的技术面试的本质与考试无差,许多知识点你可能之前没有涉及,之后也不会用到,但面试官提问时,你一定得会。如果你只是精专于之前业务中的内容,那无疑所掌握的知识点会非常会非常片面,也会极大的限制你的发展性,减少你可选择的选项。Android开发面试必问经典题目Handler相关知识,面试......
  • 最新Android音视频开发学习指南,建立自己的技术护城河
    我们常说音视频是程序员小众领域,但其实音视频技术在日常生活中随处可见:直播中要保证在各种网络状况下实现超低价延时、降低卡顿率,就需要用到音视频中的RTC和直播技术;上百人的视频会议若要保证流畅度和清晰的画质就要用到RTC和转码合流服务等技术…Android音视频开发进阶指南目......
  • Android模仿微博的LazyFragment懒加载
    本文会从头开始一步一步带你去写一个LazyFragment,根据写的过程中一步一步记录,你也可以自己试一试,跟着一起写写。最后也根据遇到的问题去完善了,网上搜的都是不完善的,还是自己写一个吧!懒加载是在加载啥?这个问题显得很愚蠢。但是想一下,懒加载到底是加载数据和视图,还是数据呢??(一开始我也......
  • 【干货分享】全套Android学习笔记+最新大厂面试真题合集,打包领取
    笔者是一名普通的软件开发人员,一向不喜欢高高在上或者晦涩难懂的理论。我认为知识的本身也应该是通俗易懂的,用晦涩难懂的东西去描述,是对人类进步的阻碍,是知识垄断。笔者希望此系列教程能够以工程实现为出发点和落脚点,简化理论知识,化繁为简地解析Android相关知识点,为各位读者成长为......
  • 【Android】iOS开发中xconfig和script脚本的使用
    利用Xcode进行开发时需要进行很多buildsetting的设置以便能让项目按照设置的进行编译,同时有时候需要在编译时利用script脚本进行一些设置,本文主要介绍xconfig文件和script脚本在Xcode开发中使用。作者:MambaYongXcode编译在使用xconfig时有几个关于Xcode的概念是需要理解的,这里我进......
  • Android AIDL 跨进程通信超详版
    来了新公司,公司项目里用了很多的独立进程的服务与他们之间存在了很多跨进程的通信。之前有很长一段时间没有实际去做跨进程通信AIDL了,查阅了一些资料和文章看了些Demo把温习的心路历程介绍一下。来模拟一个ktv播控系统(client)控制大屏上的歌曲的播放、暂停动作KtvAIDLClientK......