首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >打印桌子

打印桌子
EN

Code Review用户
提问于 2016-09-26 14:22:04
回答 2查看 134关注 0票数 3

我有一个递归函数,它打印了一个表,但是我真的认为我目前的解决方案很难看。有人知道我如何改进我的解决方案吗?

我试图在没有任何变量的情况下使用sprintf来实现。

代码语言:javascript
运行
AI代码解释
复制
let rec rec n =
   if n > 0 then
      rec(n-1) + sprintf "\n"+sprintf "%d" (n*1) + sprintf "\t%d" (n*1)+ sprintf "\t%d" (n*2) + sprintf "\t%d" (n*3) + sprintf "\t%d" (n*4)
+ sprintf "\t%d" (n*5) + sprintf "\t%d" (n*6) + sprintf "\t%d" (n*7) + sprintf "\t%d" (n*8) + sprintf "\t%d" (n*9) + sprintf "\t%d" (n*10)
   else
      sprintf "\t%d" 1 + sprintf "\t%d" 2 + sprintf "\t%d" 3 + sprintf "\t%d" 4 + sprintf "\t%d" 5 + sprintf "\t%d" 6 + sprintf "\t%d" 7 + sprintf "\t%d" 8 + sprintf "\t%d" 9 + sprintf "\t%d" 10
printfn "%s" (rec 6)
EN

回答 2

Code Review用户

发布于 2016-09-26 19:15:32

首先,sprintf不只是采取一个论点,这将不是很有用的。它所使用的参数(以及相应类型)与格式字符串中提到的一样多。

所以,不是这样的:

代码语言:javascript
运行
AI代码解释
复制
   sprintf "%d" (n*1) + sprintf "\t%d" (n*2)

你可以这样做:

代码语言:javascript
运行
AI代码解释
复制
   sprintf "%d\t%d" (n*1) (n*2)

其次,所有这些sprintf调用看起来都与我非常相似。当有重复的时候,通常会有一种方法通过参数化来缩短它。您的sprintfs的第一行可能是这样的:

代码语言:javascript
运行
AI代码解释
复制
   let columns = [1..10] |> List.map ( (*) n ) |> String.concat "\t"
   sprintf "\n%s" columns

你的第二行sprintfs根本不需要任何sprintfs

代码语言:javascript
运行
AI代码解释
复制
   "\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10"

(尽管您也可以使用一个列表来表示清楚,特别是如果您希望使它对不同数量的列有用)

第三,这个递归函数永远不会完成。仔细看一看:从来没有这个函数不调用自己的情况。当n=0的时候,它会用n=6来称呼自己,当n>0时,它会用n=n-1来称呼自己。所以,一旦你称之为它,它就会无限期地自我标榜。嗯,不完全是无限期的,但是直到它用完为止。

根据您的解释(“打印一个表”),我得出的结论是,您真正想要的是首先打印标题(常量字符串),然后在它下面打印6行,每行10个数字。对吗?如果是这样的话,基本大小写应该只返回标头,每个非基本大小写都应该构造它的行并将先前的结果加到它的前面:

代码语言:javascript
运行
AI代码解释
复制
let row n = 
   [1..10]
   |> List.map ( (*) n ) 
   |> String.concat "\t"
   |> sprintf "\n%s"

let rec table n =
   if n > 0 then table (n-1) + row n
   else "\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10"

第四,这一任务并不真正需要递归。是的,您可以将任何顺序进程编码为递归函数,但递归很难实现。要正确理解(如本例所示)是很棘手的,在阅读代码时更难理解。解决此类问题的通常方法是将递归(在核心库中)编码一次,作为参数化函数(对于线性过程,这类函数通常称为fold),然后在更高级别的代码中使用该函数或其导数。在您的特殊情况下,由于您只想生成几个字符串并将它们连接起来,所以我将使用map

代码语言:javascript
运行
AI代码解释
复制
let row n = 
   [1..10]
   |> List.map ( (*) n ) 
   |> String.concat "\t"
   |> sprintf "\n%s"

let table n = 
   let header = "\t1\t2\t3\t4\t5\t6\t7\t8\t9\t10"
   let rows = [1..n] |> List.map row
   sprintf "%s\n%s" header (String.concat "\n" rows)
票数 6
EN

Code Review用户

发布于 2016-09-27 07:40:12

递归解决方案可以是:

代码语言:javascript
运行
AI代码解释
复制
let print rows cols = 
  let listRow row =  ([1 .. cols] |> List.fold (fun str n -> sprintf "%s\t%d" str (n * row)) "")
  let head = listRow 1

  let rec doRow row = 
    if row <= rows then
      let curline = sprintf "%d%s" row  (listRow row)
      let nextlines = doRow (row + 1)
      sprintf "%s\n%s" curline nextlines
    else
      ""
  sprintf "%s\n%s" head (doRow 1)

[<EntryPoint>]
let main argv = 
  printfn "%s" (print 6 10)

  Console.ReadLine()|>ignore
  0

以及一个基于清单的版本:

代码语言:javascript
运行
AI代码解释
复制
let print rows cols = 
  let listRow row = 
    [1 .. cols] 
    |> List.map (fun n -> sprintf "%d" (n * row)) 
    |> String.concat "\t"

  let header = sprintf "\t%s" (listRow 1)

  let table = 
    [1 .. rows]
    |> List.map (fun n -> sprintf "%d\t%s" n (listRow n))
    |> String.concat "\n"

  sprintf "%s\n%s" header table
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/142542

复制
相关文章
改变视图的位置和大小
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u010105969/article/details/53068421
用户1451823
2018/09/13
1.3K0
拖动图片改变位置
在线展示:https://gethtml.cn/project/2020/04/14/index.html
Dreamy.TZK
2020/04/16
6.8K1
拖动图片改变位置
Qt-改变tabBar位置并改变文字方向
QTabWidget默认tab页标题(tabBar)在上面,但是有时候我们需要改变它的位置,比如做一个设置页面,想将它放到左边显示,这个比较简单,只需要设置一个属性即可实现:tabPosition:west,但是我们发现它文字的方向是没有改变的,这样完全没有使用体验,所以我们需要改变文字的方向。
kdyonly
2023/03/03
3.5K0
Qt-改变tabBar位置并改变文字方向
「R」cowplot(二)改变轴位置
从ggplot2的2.2.0版本开始,它本身就支持图形的第二个轴。因此,cowplot的函数switch_axis_position()已经过时了。下面是一些可以用ggplot2实现的例子。
王诗翔呀
2020/07/06
8900
「R」cowplot(二)改变轴位置
原生dom拖拽改变位置
先上效果图: 图片 废话不多说了 直接上代码吧... 很简单的 就是一些原生操作 <!DOCTYPE html> <html lang="en">   <head>     <meta charset="UTF-8" />     <meta name="viewport" content="width=device-width, initial-scale=1.0" />     <title>Document</title>   </head>   <style>     .drapDom {   
biaoblog.cn 个人博客
2022/08/11
1.1K0
原生dom拖拽改变位置
python | pandas 改变列的位置、填充缺失值
本期的文章源于工作中,需要固定label的位置,便于在spark模型中添加或删除特征,而不影响模型的框架或代码。 spark的jupyter下使用sql 这是我的工作环境的下情况,对你读者的情况,需要具体分析。 sql = ''' select * from tables_names -- hdfs下的表名 where 条件判断 ''' Data = DB.impala_query(sql) -- 是DataFrame格式 **注意:**DB是自己写的脚本文件 改变列的
努力在北京混出人样
2019/02/18
5.3K0
python | pandas 改变列的位置、填充缺失值
本期的文章源于工作中,需要固定label的位置,便于在spark模型中添加或删除特征,而不影响模型的框架或代码。 spark的jupyter下使用sql 这是我的工作环境的下情况,对你读者的情况,需要具体分析。 sql = ''' select * from tables_names -- hdfs下的表名 where 条件判断 ''' Data = DB.impala_query(sql) -- 是DataFrame格式 **注意:**DB是自己写的脚本文件 改变列的位置 前
努力在北京混出人样
2018/05/14
5.6K0
一文带你了解 Flink 基本组件栈
Flink 同样遵循着分层的架构设计理念,在降低系统耦合的同时,也为上层用户构建 Flink 应用提供了丰富且友好的接口。
kk大数据
2019/09/24
9250
一文带你了解 Flink 基本组件栈
热点图 页面缩放不改变位置
jQuery下载地址:http://cdn.hcses.com/jquery/jquery.js CSS下载地址:http://cdn.hcses.com/common/mobile-style.css
华创信息技术
2019/11/08
2K0
改变Android手机软件安装位置方法
发表评论 862 views A+ 所属分类:技术 谷歌Android系统手机默认只能把软件安装在手机 内存里,使本来就不大的手机内存显得捉襟见肘。如果你也是个手机软件狂人,喜欢尝试各种各样新奇
用户1127987
2018/06/04
2.2K0
利用深度学习改变位置感知计算
位置感知位于定位服务(LBS)的核心位置。然而,准确地估计目标的位置并不那么简单。全球定位系统(GPS),可以直接输出地理空间坐标,但它的错误可能远远超出了某些应用的容许度。在GPS定位区域,可以通过惯性测量单元(imu)和照相机等传感器提供的原始数据间接推断出位置。通常,数据,无论是直接测量地理空间坐标还是推断位置,都必须经过相当费力的人工数据处理管道,才能被高水平的LBS所消耗。本文回顾了最近两项关于将深度学习模型引入位置感知计算的尝试,有效地减少了专家的参与。 一、目标跟踪通过部分可观察的随机过程 h
AiTechYun
2018/03/02
1.6K0
利用深度学习改变位置感知计算
实现盒子宽度随鼠标位置而改变
当鼠标在拖动线(drag-line)区域内按下时,监听鼠标移动,获取鼠标移动的实时距离 将这个距离加上leftCategory本来的宽度,就是leftCategory随着鼠标移动的宽度
切图仔
2022/09/08
1K0
[Qt]窗口大小、位置及其大小改变引起的事件QResizeEvent
原文链接:https://blog.csdn.net/humanking7/article/details/86108269
祥知道
2020/03/10
11.2K0
Windiows桌面文件不能拖动以改变位置
2008-10-01 据说出现这种情况的解决方法是按几下ESC键就行了,我试了一下还挺灵。 百度知道解决方案位置:http://zhidao.baidu.com/question/64530794.html 少小离家老大回 乡音无改鬓毛衰 儿童相见不相识 笑问客从何处来 离别家乡岁月多 近来人事半消磨 惟有门前镜湖水 春风不改旧时波
雷大亨
2017/12/29
9060
安卓代码动态改变控件位置和属性
以下代码改变TextView的margin和CENTER_HORIZONTAL属性。
用户4458175
2020/02/12
1.7K0
Docker的基本组成
CentOS Docker 安装 Docker支持以下的CentOS版本: CentOS 7 (64-bit) CentOS 6.5 (64-bit) 或更高的版本
玖柒的小窝
2021/09/17
4450
Docker的基本组成
Docker的基本组成
  Docker镜像就好像一个模板,可以通过这个模板来创建服务,就比如在JAVA中,你新建一个类比如A类,在运行中,这个类就会变成Class文件,那么在其他类中就可以多次通过New 关键字创建,而Docker也是这个原理,比如我们拉取一个 tomcat镜像,那么就可以创建多个tomcat
彼岸舞
2021/02/25
4010
Docker的基本组成
word批量操作图片到指定位置改变大小改变版式
环境:winx office2019+ 语言:vba+word 第一步:插入图片,这里不再赘述 重要代码
2021/11/08
1.5K0
javascript如何改变cssText
<meta http-equiv="content-type" content="text/html; charset=utf-8"/>
马克java社区
2020/08/01
1K0
javascript如何改变cssText
如何改变文件权限
昨天我们已经知道了怎么查看文件的权限,那么是不是迫不及待的想要给自己开点权限?先别急,今天又get了一个小小的tip。昨天我们只学习了使用ls -al。想要查看ls的其他用法可以使用man ls 和info ls。 OK ,今天的tips就到这,我们来看怎么修改文件权限。
用户3258338
2019/07/19
1.2K0
如何改变文件权限

相似问题

字节上的异或运算

11

需要帮助将c#异或转换为Java

11

单字节异或密码

10

c#在字节数组上应用64位异或

20

将异或转换为NOR

24
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档