鱼C论坛

 找回密码
 立即注册
查看: 1414|回复: 2

[已解决]用递归返回字典

[复制链接]
发表于 2023-9-3 22:55:52 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
def ladder_word_dict(word):
   
    def helper(word,length):
        if length == 1:
            return {1:word[0]}
        else:
            result=helper(word,length-1)
            result[length]=word[:length]
            return result
    return helper(word,length)   
   
word = "Recursion"
length = len(word)
ladder_word_dict(word)   

以上代码的output是:
{1: 'R',
2: 'Re',
3: 'Rec',
4: 'Recu',
5: 'Recur',
6: 'Recurs',
7: 'Recursi',
8: 'Recursio',
9: 'Recursion'}



我想请教的是为什么output不是以下这样:
{9: 'Recursion',
8: 'Recursio',
7: 'Recursi',
6: 'Recurs',
5: 'Recur',
4: 'Recu',
3: 'Rec',
2: 'Re',
1: 'R'}
最佳答案
2023-9-3 22:56:17
这个问题是因为在递归函数中,我们首先调用了 helper(word, length-1) 来获取前 length-1 个字符的字典,然后将当前的长度和对应的子字符串添加到字典中。这样,字典中的键值对的顺序就是按照递归的顺序添加的。

所以,当我们递归到最后一个字符时,它会先获取前8个字符的字典,然后将当前的长度和对应的子字符串添加到字典中。这样就会导致最后一个字符的键值对排在最前面。

如果我们想要按照倒序的顺序输出字典,我们可以在递归函数中稍作修改。我们可以先递归到最后一个字符,然后在返回的字典中将键值对反转。这样就可以得到按照倒序排列的字典。

下面是修改后的代码:
def ladder_word_dict(word):
    
    def helper(word, length):
        if length == 1:
            return {1: word[0]}
        else:
            result = helper(word, length-1)
            result[length] = word[:length]
            return {k: result[length-k] for k in result}
    
    return helper(word, length)
    
word = "Recursion"
length = len(word)
ladder_word_dict(word)

这样修改后的代码将会输出以下结果:
{9: 'Recursion',
 8: 'Recursio',
 7: 'Recursi',
 6: 'Recurs',
 5: 'Recur',
 4: 'Recu',
 3: 'Rec',
 2: 'Re',
 1: 'R'}

现在,字典中的键值对按照倒序的顺序排列了。

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-9-3 22:56:17 | 显示全部楼层    本楼为最佳答案   
这个问题是因为在递归函数中,我们首先调用了 helper(word, length-1) 来获取前 length-1 个字符的字典,然后将当前的长度和对应的子字符串添加到字典中。这样,字典中的键值对的顺序就是按照递归的顺序添加的。

所以,当我们递归到最后一个字符时,它会先获取前8个字符的字典,然后将当前的长度和对应的子字符串添加到字典中。这样就会导致最后一个字符的键值对排在最前面。

如果我们想要按照倒序的顺序输出字典,我们可以在递归函数中稍作修改。我们可以先递归到最后一个字符,然后在返回的字典中将键值对反转。这样就可以得到按照倒序排列的字典。

下面是修改后的代码:
def ladder_word_dict(word):
    
    def helper(word, length):
        if length == 1:
            return {1: word[0]}
        else:
            result = helper(word, length-1)
            result[length] = word[:length]
            return {k: result[length-k] for k in result}
    
    return helper(word, length)
    
word = "Recursion"
length = len(word)
ladder_word_dict(word)

这样修改后的代码将会输出以下结果:
{9: 'Recursion',
 8: 'Recursio',
 7: 'Recursi',
 6: 'Recurs',
 5: 'Recur',
 4: 'Recu',
 3: 'Rec',
 2: 'Re',
 1: 'R'}

现在,字典中的键值对按照倒序的顺序排列了。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-9-3 23:05:15 | 显示全部楼层
isdkz 发表于 2023-9-3 22:56
这个问题是因为在递归函数中,我们首先调用了 helper(word, length-1) 来获取前 length-1 个字符的字典,然 ...

貌似输出的值不对,您给的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-21 14:47

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表